我正在尝试创建正则表达式以进行匹配:
我在正则表达式下进行了尝试,但只有第一个条件在起作用,返回DS_。 DS_之后的其他内容都可以,但DS_TRUE不匹配。
Regex = (re.findall('(return DS_)|(return Status)&(^!return DS_TRUE)', Line))
****Should Match****
Line = 'return DS_YES'
Line = 'return DS_FALSE'
Line = 'return DS_EVER'
Line = 'return Status'
****Should not match****
Line = 'return DS_TRUE'
答案 0 :(得分:2)
您的模式(return DS_)|(return Status)&(^!return DS_TRUE)
包含3个捕获组。
第一组匹配return DS_
,第二组匹配return Status
,然后匹配与号。
第三组使用锚点^
声明字符串的开头,然后匹配!return DS_TRUE
。
返回后,您可以使用负前瞻来断言右边的不是DS_TRUE。
\breturn (?!DS_TRUE).*
如果要从字符串的开头进行匹配,则也可以使用锚点^
代替单词边界\b
。
如果仅当匹配项以DS_
开头,然后是所有后面的内容或仅是Status时,才可以进行匹配,则可以使用:
\breturn (?!DS_TRUE)(?:DS_.*|Status)
\breturn[ ]
字边界,匹配返回,后跟一个空格(仅出于清晰起见,标记为[ ]
)(?!DS_TRUE)
负向查找,断言直接在右边的不是DS_TRUE (?:
非捕获组
DS_.*
匹配DS_,然后匹配除换行符外的0+个字符|
或Status
比赛状态)
关闭非捕获组答案 1 :(得分:1)
使用re.findall
例如:
import re
Line = """ 'return DS_YES'
Line = 'return DS_FALSE'
Line = 'return DS_EVER'
Line = 'return Status'
Line = 'return DS_TRUE'
"""
r = re.findall('(return DS_(?!TRUE).*|return Status)', Line)
print(r)
输出:
["return DS_YES' ", "return DS_FALSE'", "return DS_EVER'", 'return Status']