正则表达式命名的条件前瞻(Python中)
我希望根据字符串后面是否存在某个字符块,以不同的方式匹配字符串的开头。一个非常简化的版本是:正则表达式命名的条件前瞻(Python中),python,regex,conditional,named,lookahead,Python,Regex,Conditional,Named,Lookahead,我希望根据字符串后面是否存在某个字符块,以不同的方式匹配字符串的开头。一个非常简化的版本是: re.search("""^(?(pie)a|b)c.*(?P<pie>asda)$""", 'acaaasda') re.search(“^(?(pie)a | b)c.*(.Pasda)$”,“acaasda”) 其中,如果匹配,我希望在字符串开头看到a,如果不匹配,我希望看到b 我会使用普通的数字前瞻,但不能保证有多少组会或不会在这两个组之间匹配 我当前收到错误:未知组名。我内心深
re.search("""^(?(pie)a|b)c.*(?P<pie>asda)$""", 'acaaasda')
re.search(“^(?(pie)a | b)c.*(.Pasda)$”,“acaasda”)
其中,如果
匹配,我希望在字符串开头看到a
,如果不匹配,我希望看到b
我会使用普通的数字前瞻,但不能保证有多少组会或不会在这两个组之间匹配
我当前收到错误:未知组名
。我内心深处的沮丧感告诉我,这是因为我想要的是不可能的(前瞻命名组并不是常规语言解析器的一个功能),但我真的很想让它起作用——另一种方法是放弃4到5个小时的正则表达式编写,明天作为递归下降解析器或其他什么东西重新编写
提前感谢您的帮助 不幸的是,我认为没有一种方法可以处理命名组。如果不介意重复太多,可以将共享条件和
或表达式一起复制:
^(ac.*asda|bc.*)$
如果它是一个复杂的表达式,您可以始终使用字符串格式来共享它(而不是复制粘贴共享部分):
您可以使用类似的方法:
^(?:a(?=c.*(?P<pie>asda)$)|b)c.*$
^(?:a(?=c.*Pasda)$)| b)c*$
如果您不需要,也可以不使用*$
。您正在搜索/解析什么类型的文本?您希望实现什么?我在你的字符串中没有看到任何馅饼。你能用相应的输出输入一些样本吗?你能用你想要的东西发布你的真实文本吗?粘贴似乎破坏了格式,而且不管怎样都超过了字符限制。但我想说的是,我有一个量,(P%s[0-9]*.?[0-9]++([0-9]+\s+)[0-9]+\/[0-9]+)
,(其中%s是1
,2
,a
,等等)一个度量单位,然后是其他一些东西。如果你有一个部分结构,比如“一撮盐”或“苦艾酒的香气”,那么数量就不必存在。因为我用它来对行进行分类和解析,所以我也要抓住它们,以免它们被认为是指令
或名称
,而不是成分行
。我想这就是我最终可能要做的。我还想到,我可能只需要重写一些其他正则表达式,以便它们需要向后查看amt
名称(请参见上面的代码片段)。
^(?:a(?=c.*(?P<pie>asda)$)|b)c.*$