正则表达式命名条件先行(在Python中)

时间:2013-07-10 05:44:53

标签: python regex conditional named lookahead

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

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

如果匹配<pie>,我希望在字符串的开头看{4}},如果不匹配,那么我宁愿看a

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

我目前正在b。在我的直觉中沉没的感觉告诉我,这是因为我想要的是不可能的(预先查看命名组并不是常规语言解析器的特征),但我真的非常想要这是工作 - 另一种方法是废弃4或5个小时的正则表达式写作并明天重做它作为递归下降解析器或其他东西。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

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

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

common_regex = "c.*"
final_regex = "^(a{common}asda|b{common})$".format(common=common_regex)

答案 1 :(得分:0)

你可以使用类似的东西:

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

或没有.*$如果您不需要它。