我在使用python正则表达式库(re
)匹配特定模式时遇到了一些麻烦。我试图匹配一个数字(最多3位数)的行,然后是一组单词(第一个单词和数字之间没有空格),这些单词以两个空格结束。一些示例,括号中包含匹配的字符串:
test(58your own becoming )Adapted from Pyramid Text utterance 81.
(46ancestral fires )In Sumerian, a language recently supplanted by
(45lap of God )Ginzberg, Legends of the Bible, p. 1.
(9Island of the Egg )The symbolism of the cosmic egg is an integral aspect of almost every mythological tradition. In the
我使用以下表达式:
(\d+).+( )
相关的python代码如下:
# the search string is `tmp`
pattern = re.compile("(\d+).+( )")
footnotes = pattern.finditer(tmp)
for footnote in footnotes:
# do something with each match
当我使用像regexr这样的测试网站时,以上所有示例都与预期完全匹配。但是,python匹配none。我有什么简单的遗失吗?我还尝试将表达式作为原始字符串传递给re
。我似乎无法在文档中找到任何其他内容。任何帮助将不胜感激!
可以找到完整的字符串here。
此时,我相当肯定它与我如何处理字符串有关。如果我从文本文件中读取并执行以下代码,则输出为空:
with open("stone.md", "r+") as f:
tmp = f.read()
pattern = re.compile(r"(\d+).+ ")
footnotes = pattern.finditer(tmp)
for footnote in footnotes:
print tmp[footnote.start():footnote.end()]
但是,如果我跑:
tmp = """test58your own becoming Adapted from Pyramid Text utterance 81."""
pattern = re.compile(r"(\d+).+ ")
footnotes = pattern.finditer(tmp)
for footnote in footnotes:
print tmp[footnote.start():footnote.end()]
我得到58your own becoming
答案 0 :(得分:5)
你的正则表达式包含ASCII编码的空格字符(你习惯的常规空格)。但是,您正在操作的全文包含不间断的空格,在HTML中为
和Unicode U+00A0
。它看起来就像人眼的常规空间,但它不是一个ASCII空间。
Python 3.6.2 (default, Jul 20 2017, 03:52:27)
[GCC 7.1.1 20170630] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> ' '.encode('ascii')
b' '
>>> ' '.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
>>> ' '.encode('utf-8')
b'\xc2\xa0\xc2\xa0'
以下正则表达式将为您提供所需内容:
pattern = re.compile(b'(\d+).+(\xc2\xa0)'.decode('utf-8'))
这样做是构造一个bytes对象,然后将其解码为utf-8字符串,以便re
可以使用它。
或者,更好的是,您可以使用\s
,它匹配您正在使用的正则表达式中的任何空格字符(涵盖Unicode):
pattern = re.compile('(\d+).+(\s\s)')
因为浏览器将不间断空格呈现为ASCII空间,它会以ASCII空间的形式传播到浏览器复制粘贴缓冲区。
一旦您披露了您正在处理的原始文本文件,我才能发现这一点。我在URL上下载了原始格式wget
,这保留了原始文件中的Unicode空格,如果我将浏览器中的大文本文件粘贴到本地计算机上的文件中,则不会发生这种情况。
哇。这是一个非常有趣的难题要解决。谢谢你的问题。