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

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

  •  
  •   Northxw · 2019-03-15 08:44:06 +08:00 · 3766 次点击
    这是一个创建于 2084 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    compiles = "|".join(compiles)
    CloudMx
        20
    CloudMx  
       2019-03-15 09:49:48 +08:00
    @Northxw 没啥。正则:请激活.+\),使用 PY2,HTML 编码为 UTF-8,测试通过。。
    delectate
        21
    delectate  
       2019-03-15 09:55:28 +08:00
    @freakxx 这个地方用断言,大材小用了。
    TimePPT
        22
    TimePPT  
       2019-03-15 10:10:21 +08:00 via iPhone
    要是这玩意本身就是邮件,建议直接读邮件头
    Northxw
        23
    Northxw  
    OP
       2019-03-15 11:31:44 +08:00   ❤️ 1
    @freakxx 断言是啥我都不知道,但是谢谢你

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

    @CloudMx OKK, 我用的 py3, 不过还是谢谢你
    TimePPT
        24
    TimePPT  
       2019-03-15 11:37:10 +08:00 via iPhone
    @Northxw 了解……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5445 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:28 · PVG 16:28 · LAX 00:28 · JFK 03:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.