我正在尝试在Python中编写一个与#34;出勤率相匹配的正则表达式"如果单词"要求"或者"强制性的"两种方式都在10个空格内。现在我的正则表达式如下所示:
re.compile(r'(attendance)\s(\w)\s(mandatory|required)')
这似乎只是匹配句子,例如"出勤是必需的"但是,它与诸如&#34之类的句子不匹配;出勤很重要。我们要求你来上课#34;知道如何编辑这个表达式吗?
答案 0 :(得分:2)
你可以通过以下方式实现它:
(?: # attendance first, then require/required
\battendance\b\W+
(?:\w+\W+){0,10}
\brequired?\b
)
|
(?: # the other way round
\brequired?\b\W+
(?:\w+\W+){0,10}
\battendance\b
)
请参阅a demo on regex101.com 问题是,这需要一段时间才能成功,并且容易发生灾难性的回溯。
<小时/> 为了加快速度,您需要更新的regex
module支持原子分组((?>...)
)。有了这个,只需要约600步。请考虑Python
中的以下代码示例:
import regex as re
string = """
attendance word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 required
required word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 attendance
required word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 attendance (too far away)
"""
rx = re.compile(r"""
(?: # attendance first, then require/required
\battendance\b\W+
(?>\w+\W+){0,10}
\brequired?\b
)
|
(?: # the other way round
\brequired?\b\W+
(?>\w+\W+){0,10}
\battendance\b
)""", re.VERBOSE)
print(rx.findall(string))
对于非正则表达式,可以查看ntlk
。
答案 1 :(得分:0)
在匹配mandatory|required
重复“空格+非空格”对之前最多9次((?:\s+\S+){0,9}
):
(attendance)(?:\s+\S+){0,9}\s+(mandatory|required)