如何将适配str.contains()的Python正则表达式改为适配str.match()?
问题:用
str.match()实现特定字符串匹配的正则写法 我在Python中搭配正则表达式和字符串方法时遇到了问题:需要判断字符串中是否存在DIAB1,要求匹配以下前两个字符串,排除第三个:
'DIAB100 MYOP''ACNE DIAB100''SADIAB100'
我已经能用str.contains(r'(^DIAB1)|( DIAB1)')实现需求,但始终写不出适配str.match()的正确正则。尝试过的正则都不行:
r'(?<=\s|^)DIAB1' # 报错:look-behind requires fixed-width pattern r'(^|\s)DIAB1' # 无法匹配'ACNE DIAB100' r'\bDIAB1' # 无法匹配'ACNE DIAB100' r'(^| )DIAB1' # 无法匹配'ACNE DIAB100'
解决方法
首先要明确:str.match()只从字符串的起始位置开始匹配整个正则表达式,这是它和str.contains()(任意位置查找)的核心区别。
要实现需求,正确的正则表达式可以写成两种形式:
写法1:分场景匹配
r'(?:DIAB1|.*\sDIAB1)'
- 用非捕获分组
(?:...)覆盖两种合法情况:DIAB1:匹配字符串开头直接以DIAB1起始的场景(对应第一个测试串).*\sDIAB1:匹配前面有任意内容+空格后接DIAB1的场景(对应第二个测试串)
写法2:简洁版
r'.*(?:^|\s)DIAB1'
.*:贪婪匹配从字符串开头到DIAB1前的所有内容(?:^|\s):确保DIAB1的前面是字符串开头(^)或空格(\s),彻底排除SADIAB100这种DIAB1前接其他字符的情况
为什么之前的尝试失败?
r'(^|\s)DIAB1':str.match()要求从开头匹配,但第二个测试串开头是ACNE,不是^或空格,整个模式无法匹配r'\bDIAB1':\b是单词边界,但str.match()从开头匹配,而DIAB1在第二个测试串的中间位置,模式无法覆盖开头到该位置的内容,所以失败r'(?<=\s|^)DIAB1':Python正则不支持可变宽度的后向断言(^是零宽度,\s是单字符,宽度不一致),因此报错
内容的提问来源于stack exchange,提问作者user13079354
相关产品推荐
相关产品推荐

