正则表达式命名为分组

时间:2010-10-22 06:21:58

标签: regex language-agnostic

您是否可以在正则表达式组中进行动态命名?像

这样的东西
reg = re.compile(r"(?PText|Or|Something).*(?PTextIWant)")

r = reg.find("TextintermingledwithTextIWant")

r.groupdict()["Text"] == "TextIWant"

因此,取决于开头的内容,分组[“Text”] == TextIWant

更新以使quesetion更清晰。

3 个答案:

答案 0 :(得分:1)

你的问题措辞有点搞笑,但我认为你所寻找的是一个非捕获组。像这样:

(?:Must_Match_This_First)What_You_Want(?:Must_Match_This_Last)

?:是指群组匹配但不捕获的原因。

答案 1 :(得分:1)

一些正则表达式引擎支持这一点,有些则不支持。 This site说Perl,Python,PCRE(以及PHP)和.NET都支持它,所有语法略有不同:

+--------+----------------------------+----------------------+------------------+
| Engine |           Syntax           |    Backreference     |     Variable     |
+--------+----------------------------+----------------------+------------------+
| Perl   | (?<name>...), (?'name'...) | \k<name>, \k'name'   | %+{name}         |
|        | (?P<name>...)              | \g{name}, (?&name)*  |                  |
|        |                            | (?P>name)*           |                  |
+--------+----------------------------+----------------------+------------------+
| Python | (?P<name>...)              | (?P=name), \g<name>  | m.group('name')  |
+--------+----------------------------+----------------------+------------------+
| .NET   | (?<name>...), (?'name'...) | \k<name>, \k'name'   | m.Groups['name'] |
+--------+----------------------------+----------------------+------------------+
| PCRE   | (?<name>...), (?'name'...) | \k<name>, \k'name'   | Depends on host  |
|        | (?P<name>...)              | \g{name}, \g<name>*  | language.        |
|        |                            | \g'name'*, (?&name)* |                  |
|        |                            | (?P>name)*           |                  |
+--------+----------------------------+----------------------+------------------+

这是完整列表,但这是我能找到的。如果您了解更多口味,请添加它们!使用*的反向引用形式是“递归”而不仅仅是反向引用;我相信这意味着它们再次与模式匹配,而不是模式与匹配的匹配。此外,我通过阅读文档来达到这个目的,但很可能会出现错误 - 这包括一些我从未使用过的语言和一些我从未使用过的功能。如果出现问题,请告诉我。

答案 2 :(得分:0)

您可以先以动态方式构建字符串,然后将其传递给Regex引擎。