正则表达式搜索从左到右?

时间:2015-06-19 01:36:58

标签: python regex

>>> test1 = "123 main street, slc, utah county, utah 84115"  # test string
>>> address_end_pattern3 = re.compile(r"\b((ut(ah)?)\,?[\s\n](84\d{3}(\-\d{4})?)|(84\d{3}(\-\d{4})?)|(ut(ah)?))\b", re.IGNORECASE) # all 3 patterns concatenated with | in the order I would like it to be found
>>> address_end_pattern2 = re.compile(r"\b((ut(ah)?)\,?[\s\n](84\d{3}(\-\d{4})?)|(84\d{3}(\-\d{4})?))\b", re.IGNORECASE)  # 2 patterns omitting the state only pattern
>>> address_end_pattern1 = re.compile(r"\b(ut(ah)?)\,?[\s\n](84\d{3}(\-\d{4})?)\b", re.IGNORECASE)  # the first pattern (state and zip) alone
>>> address_end_pattern1.search(test1).group()
'utah 84115'  # it finds the first pattern correctly when it is the only pattern
>>> address_end_pattern3.search(test1).group()  # but not when the state only pattern is there
'utah'
>>> address_end_pattern2.search(test1).group()
'utah 84115'  # finds the first pattern when combined with zip alone

在上一个问题确认之后,我相信正则表达式从左到右搜索字符串和模式......但后来发生了这种情况。如果它自己正确地找到了模式,并且当与zip模式连接时,为什么它只是在连接模式中的最后一个选项时才找到状态模式?任何人都可以解释这种行为吗?

编辑: 为清楚起见,如果是第一个模式,该模式是地址结束的最佳指标:

r"\b(ut(ah)?)\,?[\s\n](84\d{3}(\-\d{4})?)\b" # with re.IGNORECASE

我正在尝试识别以下内容: UT,84115 要么 犹他州,84115-0001

如果没有发生,那么只需一个邮政编码就可以确定地址的结尾:

r"\b(84\d{3}(\-\d{4})?))\b"

哪个应匹配:

84115 要么 84115-0011

然后最后,如果两者都不匹配,那么我想要只查找状态:

\ B(UT(AH)?)\ B'/ P>

哪个匹配: UT 要么 犹他州

我想按顺序找到它,因为最后两个可能会切断一些信息,或者在各种情况下使用可能列出的第二个地址,因为地址列为:

1234 main st,slc UT和1235 main st,slc UT 84115

3 个答案:

答案 0 :(得分:1)

我不确定这是否是您想要的,但如果您使用findall代替search,则应返回您要查找的所有匹配项的列表。

address_end_pattern3.findall(test1)

我不确定,但我认为您的问题与re.search工作原理和|工作原理之间的互动有关。

答案 1 :(得分:1)

正则表达式与utah中的utah county匹配,原因是您的第3种模式中的第3个选项。既然它出现在你想要的" utah 84115"之前,那是你的第一场比赛,utah 84115是第二场比赛。如果你换掉"犹他州84115"和"犹他州",它有效。 https://regex101.com/r/zQ4rJ1/5

答案 2 :(得分:1)

正则表达式搜索始终在首先开始的文本中找到匹配项。对于您的示例模式,它是"utah"的{​​{1}}部分。如果模式中的多个替代项可以从相同的字符开始匹配,则它会选择模式中的替代项("utah county"的左侧),这可能不是最长的。使用|(而不是search)时,文本的其余部分甚至从未被检查过,因此无法获得以后的匹配。

您的示例模式和文本可以归结为一个更简单的示例,这可能有助于您使用它并了解正在发生的事情。这里findall代表了" utah" (在文本中出现两次)和a是邮政编码的代表(只出现一次)。

b