用于条件(|)匹配的python正则表达式

用于条件(|)匹配的python正则表达式,python,regex,Python,Regex,正在查找python正则表达式模式。似乎它必须存在,但它让我感到困惑 如果我需要找到一个地址,我正在搜索的字符串可以是 address_is_after_123 - or - 123_address_is_before 注意,可能有两个以上的排列,但我希望两个排列的解决方案可以扩展到更多 我可以简单地创建多个正则表达式,但理想情况下我想要一个正则表达式。我最好的办法是: m = re.match("(?:address_is_after_(\d+)|(\d+)_address_is_befo

正在查找python正则表达式模式。似乎它必须存在,但它让我感到困惑

如果我需要找到一个地址,我正在搜索的字符串可以是

address_is_after_123
 - or -
123_address_is_before
注意,可能有两个以上的排列,但我希望两个排列的解决方案可以扩展到更多

我可以简单地创建多个正则表达式,但理想情况下我想要一个正则表达式。我最好的办法是:

m = re.match("(?:address_is_after_(\d+)|(\d+)_address_is_before)",text)

这是可行的,但我必须测试m.group(1)或m.group(2)是否具有该值。有没有一种方法可以写入正则表达式,这样如果它匹配,我就可以在不进行额外处理的情况下获取地址?

您可以使用lookarounds来完成,前提是lookback的长度(
“address\u Is\u after”
)是常量:

>>> m = re.search(r"(?<=address_is_after_)\d+|\d+(?=_address_is_before)",text)
>>> m.group(0)
'123'

>>m=re.search(r)(?您不需要测试哪个组具有匹配项。不匹配的组返回
None
,被
视为false:

>>> for text in ["address_is_after_123", "123_address_is_before"]:
...             m = re.match("(?:address_is_after_(\d+)|(\d+)_address_is_before)",text)
...             print(m.group(1) or m.group(2))
...
123
123

有趣。我一直在考虑re.match(),而不是re.search())这不是一个范式转换的地方,这与<代码>搜索< <代码> vs>代码>匹配< /COD>无关,只有后者在字符串的起始处是无法匹配的,并且因为这个数可以在字符串的中间,所以我需要使用<代码>搜索< /> >。(?我想我的意思是,我习惯于使用match()并使用m.group(1[或2或3])提取子字符串。我通常忽略group(0)。因此使用lookarounds并使用group(0)我要找的似乎是背景词。但既然这就是解决问题所需要的,我就必须改变我的思维方式。你是对的,改变不是匹配与搜索,而是对周围人。