Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,注意:我知道现有的re模块不支持这些功能,我正在使用更新的re 我需要构建一些复杂的正则表达式,但我也希望这些表达式是可维护的。我不想让任何人几个月后再回到这段代码,不得不花上几天的时间来解释或重新编写这个表达式,包括我自己在内P 我以前使用过一些PCRE语法来实现这一点,例如: / (?(DEFINE) (?<userpart> thomas | richard | harold ) (?<domainpart> gmail | yahoo | hotmail

注意:我知道现有的
re
模块不支持这些功能,我正在使用更新的
re

我需要构建一些复杂的正则表达式,但我也希望这些表达式是可维护的。我不想让任何人几个月后再回到这段代码,不得不花上几天的时间来解释或重新编写这个表达式,包括我自己在内P

我以前使用过一些PCRE语法来实现这一点,例如:

/
(?(DEFINE)
  (?<userpart> thomas | richard | harold )
  (?<domainpart> gmail | yahoo | hotmail )
  (?<tld> com | net | co\.uk )
  (?<email> (?&userpart)@(?&domainpart)\.(?&tld) )
)
^ To: \s+ .* \s+ < (?&email) > $
/ix
/
(?(定义)
(?托马斯|理查德|哈罗德)
(?gmail |雅虎| hotmail)
(?com | net | co\.uk)
(?(?&userpart)@(?&domainpart)\.(?&tld))
)
^发送至:\s+.*\s+<(?&电子邮件)>$
/九
将匹配行:
到:Tom Selleck

注意²:我没有尝试匹配电子邮件地址,这只是一个例子

我看到
regex
模块实现了递归模式,并命名了递归模式,但它似乎不喜欢
(?(DEFINE)…)
语法,在位置10给出了错误
未知组


在Python中可以预先定义这样的命名模式吗?

因为在新的Python正则表达式模块中没有像Perl/PCRE
(?(define)…)
这样的语法,您可以使用这个技巧(我认为它在Ruby中也可以工作):

导入正则表达式
模式=r''
(?托马斯|理查德|哈罗德){0}
(?gmail |雅虎| hotmail){0}
(?com | net | co\.uk){0}
(?(?&userpart)@(?&domainpart)\.(?&tld)){0}
^发送至:\s+.*\s+<(?&电子邮件)>$
'''

由于您添加了量词
{0}
,因此可以获得零宽度的组定义,您可以将其放在任何地方。

由于在新的python正则表达式模块中没有像Perl/PCRE
(?(DEFINE)…)
这样的语法,您可以使用这个技巧(我认为它在Ruby中也可以工作):

导入正则表达式
模式=r''
(?托马斯|理查德|哈罗德){0}
(?gmail |雅虎| hotmail){0}
(?com | net | co\.uk){0}
(?(?&userpart)@(?&domainpart)\.(?&tld)){0}
^发送至:\s+.*\s+<(?&电子邮件)>$
'''

由于您添加了量词
{0}
,因此您获得了可以放在任何地方的零宽度组定义。

您是否尝试编写示例:
(?com | net | co\.uk){0}
递归与定义构造不同。另外,在中没有提到regex模块支持它。我在regex的文档中没有看到类似的内容,所以我认为答案是否定的。我是对的,你仍然可以在匹配行为方面达到你想要的效果,你只是想以更具可读性的方式编写regex?@CasimiretHippolyte你赢了超级。删除了
(?(DEFINE)…)
块,在模式的末尾添加了
{0}
,它成功了!如果你想把这个问题正式化,我很乐意接受。Youpi!!!您是否尝试编写示例:
(?com | net | co\.uk){0}
递归不同于定义构造。另外,在中没有提到regex模块支持它。我在regex的文档中没有看到类似的内容,所以我认为答案是否定的。我是对的,你仍然可以在匹配行为方面达到你想要的效果,你只是想以更具可读性的方式编写regex?@CasimiretHippolyte你赢了超级。删除了
(?(DEFINE)…)
块,在模式的末尾添加了
{0}
,它成功了!如果你想把这个问题正式化,我很乐意接受。Youpi!!!如果regex的风格不支持注释,那么可以使用它来添加注释group@Denomales:为什么不呢。很高兴再次见到你!如果regex的风格不支持注释,那么可以使用它来添加注释group@Denomales:为什么不呢。很高兴再次见到你!
import regex

pattern = r'''
  (?<userpart> thomas | richard | harold ){0}
  (?<domainpart> gmail | yahoo | hotmail ){0}
  (?<tld> com | net | co\.uk ){0}
  (?<email> (?&userpart)@(?&domainpart)\.(?&tld) ){0}

  ^ To: \s+ .* \s+ < (?&email) > $
'''