正则表达式没有返回结果

时间:2017-06-20 07:10:19

标签: python regex

我编写了一个正则表达式,可以从unicode字符串中提取一段时间(例如。2014-2015)。正则表达式中的\d{1,2}\^表示月份代码,可能存在也可能不存在。

无论如何,这是我写的代码:

# -*- coding: utf-8 -*-

import re
list_elem = '''Frank P. Smith (1886–1888)
Edgar Grant Sisson (1914–1917)
Douglas Z. Doty (1917–1918)
 {{Ray Long}} (1918–1931)

Harry Payne Burton (1931–1942)
Frances Whiting (1942–1945)
Arthur Gordon (1946–1948)'''

period_regex = ur'(\d{1,2}\^)?\s?\d{4}\s?(–|-)\s?(\d{1,2}\^)?\s?\d{4}'  #regex for checking if its a single year or period

#checking if a normal regex works
print re.search(r'W', list_elem, flags=re.IGNORECASE)
print re.findall(r'W\w+', list_elem, flags=re.IGNORECASE)

#main regex
print re.search(period_regex, list_elem, flags=re.IGNORECASE)
print re.findall(period_regex, list_elem, flags=re.IGNORECASE)

输出是:

<_sre.SRE_Match object at 0x7f8bfd1b5510>
['Whiting']
None
[]

我写的正则表达式似乎正常工作。这是指向正则表达式的链接:https://regex101.com/r/scAtgw/2

然而,当我运行程序时,我仍然得到一个空的匹配。我有什么想法我做错了吗?

2 个答案:

答案 0 :(得分:2)

添加&#39; u&#39;作为list_elem中的前缀和打印语句中的.encode('utf8')应解决您的问题。例如,

print re.search(period_regex, list_elem, flags=re.IGNORECASE).group(0).encode('utf8')

答案 1 :(得分:2)

这里的主要问题是,由于您使用的是Unicode文本,因此输入字符串也应该是Unicode。这可以通过在字符串文字中添加u前缀来修复。

但是,re.findall会出现问题,只有在模式中定义了捕获组内容时才会返回捕获组内容。由于您的模式包含捕获组,因此您将获得一个元组列表。因此,您需要将所有捕获组转换为非捕获

如果您需要打印值,则可能需要.encode("utf8")值。

请参阅Python 2 demo online

# -*- coding: utf-8 -*-
import re
list_elem = u'''Frank P. Smith (1886–1888)
    Edgar Grant Sisson (1914–1917)
    Douglas Z. Doty (1917–1918)
     {{Ray Long}} (1918–1931)

    Harry Payne Burton (1931–1942)
    Frances Whiting (1942–1945)
    Arthur Gordon (1946–1948)'''

period_regex = ur'(?:\d{1,2}\^)?\s?\d{4}\s?[–-]\s?(?:\d{1,2}\^)?\s?\d{4}'  #regex for checking if its a single year or period
print re.search(r'W', list_elem, flags=re.IGNORECASE)
print re.findall(r'W\w+', list_elem, flags=re.IGNORECASE)

print re.search(period_regex, list_elem, flags=re.IGNORECASE).group(0).encode('utf8')
for x in  re.findall(period_regex, list_elem, flags=re.IGNORECASE):
    print x.encode('utf8')

结果:

<_sre.SRE_Match object at 0x2b05baf525e0>
[u'Whiting']
1886–1888
1886–1888
1914–1917
1917–1918
1918–1931
1931–1942
1942–1945
1946–1948

请注意u"""中的list_elem = u'''Frank,并且所有(都会被模式中的(?:替换,从而使这些群组无法捕获。

此外,[–-](?:–|-)相同,但更短,效率更高。