使用以前编译的正则表达式构建正则表达

时间:2016-01-09 23:17:36

标签: python regex

我有一个正则表达式:

override func viewDidLoad() {
   // myCustomView is an IBOutlet in the view controller
   myCustomView.question = question
}

有没有办法使用valid_name = re.compile("^[_a-zA-Z][_a-zA-Z0-9]*$") 构建新的正则表达式?类似的东西:

valid_name

我不想使用字符串连接,而是使用新编译的正则表达式。

1 个答案:

答案 0 :(得分:0)

您无法重用已编译的正则表达式,但您可以比纯字符串连接做得更好。

Python的regex模块supports Perl的(?(DEFINE)...)语法。

因此,您可以使用以后要重用的公共表达式定义一个字符串,将其连接到您的模式,并使用递归语法调用子表达式:(?&name)

以下是一个例子:

import regex

common = r"""(?(DEFINE)
             (?<VALID_NAME>\b[_a-zA-Z][_a-zA-Z0-9]*)
             (?<SOMETHING_ELSE>[-+/*])
         )"""

pattern = regex.compile(common + r"((?&VALID_NAME)\.)*(?&VALID_NAME)")

result = pattern.search("42hello! foo.bar.baz")

print(result[0])

输出:

foo.bar.baz