Python中正则匹配问题如何解决?
ss=re.findall(u'(\d+)小时前',s) 这里的 u 是表示匹配汉字吗?为啥有人说里面有汉字必须用 u 呢?
Python中正则匹配问题如何解决?
6 回复
用的 py 版本是什么,py2 的话就是 Unicode 的问题,也就是中文编码
正则匹配的核心是re模块。遇到问题先检查这几个点:
-
模式字符串:记得用原始字符串
r"pattern",避免反斜杠转义问题 -
匹配方法选择:
re.match():只从字符串开头匹配re.search():搜索整个字符串re.findall():找所有匹配项re.finditer():返回迭代器,适合大文本
-
常见坑:
- 贪婪匹配:
.*会匹配到最后一个符合条件的字符,用.*?非贪婪 - 分组捕获:
()会捕获内容,用(?:)不捕获 - 空白字符:
\s匹配空格、制表符等
- 贪婪匹配:
看个例子,匹配邮箱:
import re
text = "联系我:test@example.com 或 admin@site.org"
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
# 找所有邮箱
emails = re.findall(pattern, text, re.IGNORECASE)
print(emails) # ['test@example.com', 'admin@site.org']
# 带分组提取用户名和域名
pattern2 = r'(\w+)@([\w.]+)'
matches = re.findall(pattern2, text)
for user, domain in matches:
print(f"用户: {user}, 域名: {domain}")
调试时可以用re.debug标志看引擎如何解析模式:
re.compile(r'\d+', re.DEBUG)
正则写复杂了难维护,简单需求用字符串方法(str.find(), str.split())更清晰。
总结:先明确需求再选方法,复杂模式分步测试。
我用其他编码就匹配不到汉字?
#2
你需要了解一下编码。http://wklken.me/posts/2013/08/31/python-extra-coding-intro.html
所以我还是推荐 Python3,不需要折腾这些问题
u 决定了你字符串的编码方式,而不是匹配的内容。
也就是说,u 改变的是你的正则表达式,而不是 s 与正则表达式之间的关系。
楼主需要了解下编码知识
http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue5/unipain.html
看完这篇你就懂了

