正则表达式匹配以下要求

时间:2019-07-11 09:09:52

标签: python regex

我正在尝试创建正则表达式以进行匹配:

我在正则表达式下进行了尝试,但只有第一个条件在起作用,返回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'

2 个答案:

答案 0 :(得分:2)

您的模式(return DS_)|(return Status)&(^!return DS_TRUE)包含3个捕获组。

第一组匹配return DS_,第二组匹配return Status,然后匹配与号。

第三组使用锚点^声明字符串的开头,然后匹配!return DS_TRUE

返回后,您可以使用负前瞻来断言右边的不是DS_TRUE。

\breturn (?!DS_TRUE).*

Regex demo

如果要从字符串的开头进行匹配,则也可以使用锚点^代替单词边界\b

如果仅当匹配项以DS_开头,然后是所有后面的内容或仅是Status时,才可以进行匹配,则可以使用:

\breturn (?!DS_TRUE)(?:DS_.*|Status)
  • \breturn[ ]字边界,匹配返回,后跟一个空格(仅出于清晰起见,标记为[ ]
  • (?!DS_TRUE)负向查找,断言直接在右边的不是DS_TRUE
  • (?:非捕获组
    • DS_.*匹配DS_,然后匹配除换行符外的0+个字符
    • |
    • Status比赛状态
  • )关闭非捕获组

Regex demo | Python demo

答案 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']