python正则表达式模块中的递归正则表达式?
我想捕获字符串中的所有python正则表达式模块中的递归正则表达式?,python,regex,recursion,Python,Regex,Recursion,我想捕获字符串中的所有[[A-Za-z].]+,也就是说,字母字符后跟一个点的所有重复 例如,在“ABC A.B.C.UVWX U.V.W.X.XYZ XY.Z.”中 我只想拉出“A.B.C.”和“U.V.W.X.”(因为它们是一个字符后跟一个点的重复) 似乎我几乎需要一个递归正则表达式来完成这个[[a-Za-z].]+ 是否可以使用python的re模块或regex模块来实现这一点?这将适用于您,使用简单的re.findall表示法: (?:(?<=\s)|(?<=^))(?:[A
[[A-Za-z].]+
,也就是说,字母字符后跟一个点的所有重复
例如,在“ABC A.B.C.UVWX U.V.W.X.XYZ XY.Z.”中
我只想拉出“A.B.C.”
和“U.V.W.X.”
(因为它们是一个字符后跟一个点的重复)
似乎我几乎需要一个递归正则表达式来完成这个[[a-Za-z].]+
是否可以使用python的
re
模块或regex
模块来实现这一点?这将适用于您,使用简单的re.findall表示法:
(?:(?<=\s)|(?<=^))(?:[A-Za-z]\.)+
输出:
['D.E.F.,'A.B.C.,'U.V.W.X.]
您可以使用非捕获组来定义匹配,然后将其嵌套在边界字符(在本例中为非字母或点)之间的重复分组,并捕获所有匹配组:
<!-- language: lang-py -->
import re
MATCH_GROUPS = re.compile(r"(?:[^a-z.]|^)((?:[a-z]\.)+)(?:[^a-z.]|$)", re.IGNORECASE)
your_string = "ABC A.B.C. UVWX U.V.W.X. XYZ XY.Z." # get a list of matches
print(MATCH_GROUPS.findall(your_string)) # ['A.B.C.', 'U.V.W.X.']
进口稀土
匹配组=重新编译(r“(?:[^a-z.]\\)+)(?:[^a-z.]\$)”,重新初始化)
您的_string=“ABC A.B.C.UVWX U.V.W.X.XYZ XY.Z.”获取匹配项列表
打印(匹配组。findall(您的字符串))#[A.B.C.,'U.V.W.X.]
有点笨重,但也应该完成边缘案例的工作
注意:上述内容也将匹配单个事件(例如,A.
如果显示为独立事件),如果您仅寻求多个重复,请将+
(一个或多个重复)替换为您选择的范围(例如,{2,}
用于两个或多个重复)
编辑:一个小的更改,以匹配字符串的开头/结尾边界。这个正则表达式似乎可以完成这项工作(测试我们是在字符串的开头还是在空格之后):
\A([A-Za-z]\)+(?使用:
这与A.B.C.
中的前导A.B.C XYZ
不匹配。您是对的,我们需要检查字符串的\s或开头,我将更新!您不需要手动将matchNum
增加1。enumerate
接受可选的start
参数:enumerate(匹配项,1)
代码由regex101自动生成:)代码现在更新为适用于A.B.C.ABC.A.B.C.UVWX U.V.W.X.XYZ XY.Z.
。输出是A.B.C.
A.B.C.
U.V.W.X.
我不认为递归是正确的词。重复是准确描述这个想法的更好方法。@BobbleBobble,谢谢你的评论。我将更新答案以包含正则表达式。
<!-- language: lang-py -->
import re
MATCH_GROUPS = re.compile(r"(?:[^a-z.]|^)((?:[a-z]\.)+)(?:[^a-z.]|$)", re.IGNORECASE)
your_string = "ABC A.B.C. UVWX U.V.W.X. XYZ XY.Z." # get a list of matches
print(MATCH_GROUPS.findall(your_string)) # ['A.B.C.', 'U.V.W.X.']
\A([A-Za-z]\.)+|(?<=\s)([A-Za-z]\.)+
>>> import re
>>> pattern = r'(?:(?<=\s)|^)(?:[A-Za-z]\.)+(?:(?=\s)|$)'
>>> re.findall(pattern, 'ABC A.B.C. UVWX U.V.W.X. XYZ XY.Z.')
['A.B.C.', 'U.V.W.X.']
>>> re.findall(pattern, 'A.B.C. UVWX U.V.W.X. XYZ XY.Z.')
['A.B.C.', 'U.V.W.X.']
>>> re.findall(pattern, 'DEF A.B.C. UVWX U.V.W.X.Y')
['A.B.C.']
pattern = r'(?<!\S)(?:[A-Za-z]\.)+(?!\S)'