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

2019-03-15 08:44:06 +08:00
 Northxw

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

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

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

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

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

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

compiles = "|".join(compiles)
CloudMx
2019-03-15 09:49:48 +08:00
@Northxw 没啥。正则:请激活.+\),使用 PY2,HTML 编码为 UTF-8,测试通过。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/544795

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX