在正则表达式中使用\ b

Ran*_*nks 3 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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

- 原创帖子 -

我正在编写一个用于识别邮政编码(并且只有邮政编码)的正则表达式,所以为了避免误报我试图在我的正则表达式中包含边界,使用以下两个:

\b\d{5}\b|\b\d{5}-\b\d{1,4}\b
Run Code Online (Sandbox Code Playgroud)

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

Zip: 
----
98839-0111
34332
Run Code Online (Sandbox Code Playgroud)

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

\b\d{5}\b|98839-0111
Run Code Online (Sandbox Code Playgroud)

甚至那不能识别98839-0111.有谁知道会发生什么?

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

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

98839-0111
Run Code Online (Sandbox Code Playgroud)

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

Wik*_*żew 6

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

试试这个正则表达式

98839-0111|\b\d{5}\b
Run Code Online (Sandbox Code Playgroud)

你会得到一个匹配.

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

\b(?:\d{5}-\d{4}|\d{5})\b
Run Code Online (Sandbox Code Playgroud)

将匹配两者,以及更多(实际上,功能相同\b\d{5}(?:-\d{4})?\b).见演示.