- 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
现在可以正确识别它。我想这意味着一旦我的一个正则表达式拉出一个字符串,任何后续的正则表达式都无法找到它?这是为什么?
答案 0 :(得分:6)
这是因为备选列表:第一部分匹配,引擎停止检查。
98839-0111|\b\d{5}\b
你会得到一场比赛。
或者,在你的情况下更通用:
\b(?:\d{5}-\d{4}|\d{5})\b
将匹配两者,以及更多(实际上,功能与\b\d{5}(?:-\d{4})?\b
相同)。 See demo
答案 1 :(得分:0)
答案 2 :(得分:0)
您的模式将从左到右计算字符串中的每个位置,因此如果模式的左侧分支成功,则根本不测试第二个分支。
我建议您使用这种解决问题的模式:
\b\d{5}(?:-\d{1,4})?\b