在正则表达式中使用\ b

时间:2015-04-15 20:47:26

标签: python regex

- SOLVED-- 我通过启用多行模式解决了我的问题,现在字符^和$完美地用于识别每个字符串的开头和结尾

- 编辑 -

我的代码:

import re
import test_regex


def regex_content(text_content, regex_dictionary):

#text_content = text_content.lower()
regex_matches = []

# Search sanitized text (markup removed) for DLP theme keywords
for key,value in regex_dictionary.items():

  # Get confiiguration settings
  min_matches = value.get('min_matches',1)
  risk = value.get('risk',1)
  enabled = value.get('enabled',False)
  regex_str = value.get('regex','')

  # Fast compute True/False hit for each DLP theme word
  if enabled:
    print "Searching for key : %s" % (key)
    my_regex = re.compile(value.get('regex'))
    hits = my_regex.findall(text_content)

    if len(hits) > 0:
      regex_matches.append((key, risk, len(hits), hits))

# Return array of results (key, risk, number of hits, regex matches)
return regex_matches

def main():


    #print defaults.test_regex.dlp_regex

    text_content = ""

    for line in open('testData.txt'):
        text_content+=line

    for match in regex_content(text_content, test_regex.dlp_regex):
        print "\nFound %s : %s" % (match[0], match[3])

    print "\n"

if __name__ == '__main__':
main()

它正在使用此处找到的正则表达式:

'Large number of US Zip Codes' : { 'regex' : "\b\d{5}(?:-\d{1,4})?\b"},

当我在我的正则表达式中加上'r'标志时,我可以找到我正在寻找的邮政编码,但是我正在搜索的文档中的每个其他5位数字。根据我的理解,这是因为它忽略了\ b字符。但是没有r标志,它找不到任何邮政编码。它在regexr中工作得很好,但在我的代码中却没有。我没有运气\ b字符工作,也没有^和$用于识别我正在搜索的字符串的开头和结尾。我对这些特殊字符的误解是什么?

- 原帖 -

我正在编写用于识别邮政编码(仅限邮政编码)的正则表达式,因此为了避免误报我试图在我的正则表达式中包含边界,使用以下两个:

\b\d{5}\b|\b\d{5}-\b\d{1,4}\b

使用在线正则表达式调试器Regexr,我的代码应正确捕获5位数的邮政编码,例如34332.但是,我有两个问题:
1.这个正则表达式在我的实际代码中不能用于查找任何邮政编码,但是当我没有边界(\ b)字符时它确实有效。我试图用我的正则表达式提取的确切代码是:

Zip: 
----
98839-0111
34332

2。我不明白为什么我的正则表达式无法在Regexr中正确识别98839-0111。我尝试过做

的超原始方法
\b\d{5}\b|98839-0111

甚至无法识别98839-0111。有谁知道会发生什么?

注意:我也尝试使用^和$作为我的正则表达式的边界,但这也找不到正则表达式,甚至在Regexr中也没有。

编辑:删除我的正则表达式的第一部分后,只留下

98839-0111

现在可以正确识别它。我想这意味着一旦我的一个正则表达式拉出一个字符串,任何后续的正则表达式都无法找到它?这是为什么?

3 个答案:

答案 0 :(得分:6)

这是因为备选列表:第一部分匹配,引擎停止检查。

尝试this regex

98839-0111|\b\d{5}\b

你会得到一场比赛。

或者,在你的情况下更通用:

\b(?:\d{5}-\d{4}|\d{5})\b

将匹配两者,以及更多(实际上,功能与\b\d{5}(?:-\d{4})?\b相同)。 See demo

答案 1 :(得分:0)

您可以使用此正则表达式:

\b(\d{5}-\d{1,4}|\d{5})\b

<强> Working demo

答案 2 :(得分:0)

您的模式将从左到右计算字符串中的每个位置,因此如果模式的左侧分支成功,则根本不测试第二个分支。

我建议您使用这种解决问题的模式:

\b\d{5}(?:-\d{1,4})?\b