1

我希望根据字符串后面是否存在某个字符块来以不同的方式匹配字符串的开头。一个非常简化的版本是:

re.search("""^(?(pie)a|b)c.*(?P<pie>asda)$""", 'acaaasda')

如果<pie>匹配,我想a在字符串的开头看到,如果不是,那么我宁愿看到b.

我会使用正常的数字前瞻,但不能保证这两个组之间将匹配或不匹配多少组。

我目前正在获取error: unknown group name. 我的直觉告诉我,这是因为我想要的是不可能的(提前命名组并不完全是常规语言解析器的功能),但我真的真的真的很想让这个工作 - 替代方案正在废弃 4 或 5 个小时的正则表达式编写,并在明天将其全部重做为递归下降解析器或其他东西。

提前感谢您的帮助。

4

2 回答 2

4

不幸的是,我认为没有办法对命名组做你想做的事情。如果您不太介意重复可以将共享条件和OR表达式复制在一起:

^(ac.*asda|bc.*)$

如果它是一个复杂的表达式,您总是可以使用字符串格式来共享它(而不是复制粘贴共享部分):

common_regex = "c.*"
final_regex = "^(a{common}asda|b{common})$".format(common=common_regex)
于 2013-07-10T06:01:11.403 回答
1

You can use something like that:

^(?:a(?=c.*(?P<pie>asda)$)|b)c.*$

or without .*$ if you don't need it.

于 2013-07-10T06:20:29.920 回答