我编写了一个正则表达式,可以从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
然而,当我运行程序时,我仍然得到一个空的匹配。我有什么想法我做错了吗?
答案 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")
值。
# -*- 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
,并且所有(
都会被模式中的(?:
替换,从而使这些群组无法捕获。
此外,[–-]
与(?:–|-)
相同,但更短,效率更高。