首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
拉勾
V2EX  ›  程序员

Python re 匹配中文数字混合字符串 掉坑了

  •  
  •   Northxw · 6 天前 · 1008 次点击

      要匹配的字符串,例如:‘请激活您的集思网账户 发件人 :OpinionWorld 集思网 时间:2019 年 3 月 9 日 19:57 (星期六)’

      要求:匹配 "请激活您的集思网账户", "OpinionWorld 集思网", "2019 年 3 月 9 日 19:57 (星期六)" 这三处有效信息,但是测试屡败,以前也没想过匹配中文....

    那,这个正则表达式该怎么写啊,虚心求教 T_T !

    24 回复  |  直到 2019-03-15 11:37:10 +08:00
        1
    krixaar   6 天前
    如果“发件人:”和“时间:”是固定存在的,直接按这俩匹配出三个.+就行了吧……
        2
    Northxw   6 天前
    @krixaar 貌似不行的,我用最基本的.*?, .*也是获取不到
        3
    ctro15547   6 天前
    如果只是固定的这一句话,用空格做分隔符,列表再切一下,拼起来不就完事了。。
        4
    delectate   6 天前
    >>> str
    '请激活您的集思网账户 发件人 :OpinionWorld 集思网 时间:2019 年 3 月 9 日 19:57 (星期六)'
    >>> re.findall(r'(.*?) 发件人 :(.*?) 时间:(.*?$)', str)
    [('请激活您的集思网账户', 'OpinionWorld 集思网', '2019 年 3 月 9 日 19:57 (星期六)')]
        5
    Northxw   6 天前
    @ctro15547 没错,split 大法好。但是我初衷是拿 re 匹配,既然遇到这个问题了,就想解决一下啊 T_T
        6
    CloudMx   6 天前
    \u8bf7\u6fc0\u6d3b\u60a8[^。]+
        7
    CloudMx   6 天前
    @CloudMx 如果是这样结尾:请激活您的集思网账户 发件人 :OpinionWorld 集思网 时间:2019 年 3 月 9 日 19:57 (星期六)。
        8
    firejoke   6 天前
    @Northxw py2 吗?改一下被匹配对象的编码试试
        9
    Northxw   6 天前
    @delectate 兄 dei, 可以的啊。为什么添加 r 就可以匹配到了呢? 求解答
        10
    Northxw   6 天前
    @firejoke py3, 不是编码,但是有看到别人全部转换成 unicode 去匹配,我没有尝试
        11
    Northxw   6 天前
    @CloudMx 谢谢你啦,就单纯匹配上面我的要求信息。
        12
    imlinhanchao   6 天前
    @Northxw 如果你的 str 是 unicode 格式,那麽你的正則要加上 u:ur'(.*?) 发件人 :(.*?) 时间:(.*?$)'
        13
    Northxw   6 天前
    @imlinhanchao 不是 Unicode, 单纯中文字符,网页上一般是 UTF8。
        14
    CloudMx   6 天前
    \u8bf7\u6fc0\u6d3b\u60a8(.)+\)
        15
    weixuan   6 天前
    4L 给出了答案,不用 r 前缀他的表达式也可以解决你的这个问题,你给的字符串没有涉及到转义的,使用 r 前缀就不用考虑转义的问题,因为 Python 的字符串本身也用\转义。比如 'ABC\\-001' ,对应的正则表达式字符串是'ABC\-001',使用 r'ABC\-001',对应的正则表达式字符串就是'ABC\-001'不变。
        16
    CloudMx   6 天前
    请激活.+\) Python2 HTML-->UTF-8
        17
    Northxw   6 天前
    @weixuan 谢谢啦
        18
    Northxw   6 天前
    @CloudMx ???
        19
    freakxx   6 天前
    .*(?=\s 发件人)|(?<=发件人\s(:|:)).*(?=\s 时间)|(?<=时间(:|:)).*

    不过需要看具体文本再看怎么写,可能前面还附带东西或者后面

    习惯写大概这样
    compiles = [
    .*(?=\s 发件人)
    (?<=发件人\s(:|:)).*(?=\s 时间)
    (?<=时间(:|:)).*
    ]

    compiles = "|".join(compiles)
        20
    CloudMx   6 天前
    @Northxw 没啥。正则:请激活.+\),使用 PY2,HTML 编码为 UTF-8,测试通过。。
        21
    delectate   6 天前
    @freakxx 这个地方用断言,大材小用了。
        22
    TimePPT   6 天前 via iPhone
    要是这玩意本身就是邮件,建议直接读邮件头
        23
    Northxw   6 天前   ♥ 1
    @freakxx 断言是啥我都不知道,但是谢谢你

    @TimePPT 这玩意本身就不是邮件,哈哈,是邮件的节点的属性值。

    @CloudMx OKK, 我用的 py3, 不过还是谢谢你
        24
    TimePPT   6 天前 via iPhone
    @Northxw 了解……
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3489 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 05:18 · PVG 13:18 · LAX 22:18 · JFK 01:18
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1