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)'