Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python正则表达式中捕获重复的子模式_Python_Regex - Fatal编程技术网

在Python正则表达式中捕获重复的子模式

在Python正则表达式中捕获重复的子模式,python,regex,Python,Regex,在匹配电子邮件地址时,在匹配类似yasar@webmail,我想捕获一个或多个(\.\w+)(我所做的有点复杂,这只是一个示例),我尝试添加(.\w+),但它只捕获最后一个匹配。例如,yasar@webmail.something.edu.tr匹配,但仅包括.tr之后的yasar@webmail部分,所以我丢失了。一些和.edu组。我可以在Python正则表达式中执行此操作,还是建议先匹配所有内容,然后再拆分子模式?您可以通过执行此操作来解决(\。\w+)仅捕获最后一个匹配的问题:((?:\。\

在匹配电子邮件地址时,在匹配类似
yasar@webmail
,我想捕获一个或多个
(\.\w+)
(我所做的有点复杂,这只是一个示例),我尝试添加(.\w+),但它只捕获最后一个匹配。例如,
yasar@webmail.something.edu.tr
匹配,但仅包括
.tr
之后的
yasar@webmail
部分,所以我丢失了
。一些
.edu
组。我可以在Python正则表达式中执行此操作,还是建议先匹配所有内容,然后再拆分子模式?

您可以通过执行此操作来解决
(\。\w+)
仅捕获最后一个匹配的问题:
((?:\。\w+)
您可以解决
(\。\w+)的问题+
仅通过执行以下操作捕获最后一个匹配:
((?:\。\w+)+)

这将起作用:

>>> regexp = r"[\w\.]+@(\w+)(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?"
>>> email_address = "william.adama@galactica.caprica.fleet.mil"
>>> m = re.match(regexp, email_address)
>>> m.groups()
('galactica', '.caprica', '.fleet', '.mil', None, None)
但它最多只限于六个亚组。更好的方法是:

>>> m = re.match(r"[\w\.]+@(.+)", email_address)
>>> m.groups()
('galactica.caprica.fleet.mil',)
>>> m.group(1).split('.')
['galactica', 'caprica', 'fleet', 'mil']
请注意,只要电子邮件地址很简单,regexp就可以了,但这会导致各种各样的问题。有关电子邮件地址正则表达式的详细处理,请参阅。

这将起作用:

>>> regexp = r"[\w\.]+@(\w+)(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?"
>>> email_address = "william.adama@galactica.caprica.fleet.mil"
>>> m = re.match(regexp, email_address)
>>> m.groups()
('galactica', '.caprica', '.fleet', '.mil', None, None)
但它最多只限于六个亚组。更好的方法是:

>>> m = re.match(r"[\w\.]+@(.+)", email_address)
>>> m.groups()
('galactica.caprica.fleet.mil',)
>>> m.group(1).split('.')
['galactica', 'caprica', 'fleet', 'mil']

请注意,只要电子邮件地址很简单,regexp就可以了,但这会导致各种各样的问题。有关电子邮件地址正则表达式的详细处理,请参阅。

re
模块不支持重复捕获(支持它):


在你的情况下,我会在以后拆分重复的子模式。它产生了一个简单易读的代码,例如,请参见中的代码。

re
模块不支持重复捕获(支持它):


在你的情况下,我会在以后拆分重复的子模式。它产生了一个简单易读的代码,例如,请参见中的代码。

这就是您要查找的:

>>> import re

>>> s="yasar@webmail.something.edu.tr"
>>> r=re.compile("\.\w+")
>>> m=r.findall(s)

>>> m
['.something', '.edu', '.tr']

这就是您正在寻找的:

>>> import re

>>> s="yasar@webmail.something.edu.tr"
>>> r=re.compile("\.\w+")
>>> m=r.findall(s)

>>> m
['.something', '.edu', '.tr']


出于好奇,在匹配重复捕获时,如何编写替换模式?
\1
\2
\3
等的含义是否根据您匹配
(\。\w+)
的次数而变化?@Li aung Yip:
\1
对应于
m.group(1)
;意思没有改变。您可以使用函数作为替换模式,并在其中调用
m.captures()
。在您的示例中,
\1
\2
\3
的含义很明显,因为它们只捕获一次。但是与
(\.\w+)
相对应的
\4
的含义是什么
\4
似乎是“第四捕获组匹配的最后一个子串”,在这种情况下,
.tr
@Li aung Yip:
m.groups()
上面明确显示了
\4
是什么。含义没有改变:
\4
m.group4
不管是什么。出于好奇,在匹配重复捕获时,如何编写替换模式?
\1
\2
\3
等的含义是否根据您匹配
(\。\w+)
的次数而变化?@Li aung Yip:
\1
对应于
m.group(1)
;意思没有改变。您可以使用函数作为替换模式,并在其中调用
m.captures()
。在您的示例中,
\1
\2
\3
的含义很明显,因为它们只捕获一次。但是与
(\.\w+)
相对应的
\4
的含义是什么
\4
似乎是“第四捕获组匹配的最后一个子串”,在本例中
.tr
@Li aung Yip:
m.groups()
上面明确显示了
\4
是什么。含义没有改变:
\4
m.groups(4)
无论它是什么。对于缩写(如果您使用小写字母):
re.sub(ur)(?:[a-z]\.{2,}',lambda m:m.group(1).替换('.',''),text)
谢谢。我可以添加括号来匹配重复的子模式,但后来有一个组与模式的最后一个匹配。我没有看到
(?:…)
构成非捕获组。添加括号可以解决这个问题。对于缩写(如果您使用小写):
re.sub(ur'((?:[a-z]\.){2,}),lambda m:m.group(1)。替换('.',''),text)
谢谢。我可以添加括号来匹配重复的子模式,但随后有一个组与模式的最后一个匹配。我没有看到
(?:…)
创建了一个非捕获组。添加该组解决了该问题。中建议捕获重复表达式,但被拒绝。但是第三方模块支持该方法。@ToddOwen,但是,这在2.7中是否现在可以实现?我不知道何时可以实现。但是,在2.7中使用re模块时,来自的答案似乎对我来说很好。@MichaelOhlrogge问题7132是关于如果捕获括号位于重复中会发生什么。该问题尚未解决,并且仍将只保留最后一个匹配项。如您链接到的答案中所述,一种可能的解决方法是将捕获括号放在重复模式的周围。(请注意,
(?:…)
不是括号).@ToddOwen明白了,谢谢,这是一个很有帮助的澄清!捕获重复表达式是在中提出的,但被拒绝了。但是它得到了第三方模块的支持。@ToddOwen但是,这在2.7中不是现在可以实现吗?我不知道什么时候可以实现。但是,在2.7中使用re模块时,来自的答案似乎对我来说很好。@MichaeLoLLLogGy 7132是关于捕获括号内重复发生的情况。问题不是固定的,并且只保留最后一个匹配。在链接的答案中提到的一个可能的解决办法是将捕获的圆括号放在重复的模式中。(注意<代码>(……)< /代码>没有捕获PAR。