【发布时间】:2016-07-04 07:06:57
【问题描述】:
我正在使用 John Gruber's regular expression 尝试匹配文档中的 URL。
我在 Python 中这样表示正则表达式:
URL_PATTERN = re.compile(ur'(?i)\b((?:https?://)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))')
这是here找到的版本的修改版本。
这在大多数情况下都很有效,除了包含不间断空格的文档。在 Python 中,我认为这表示为 \xc2\xa0。
这是我试图解析的示例字符串;希望这些字符能完整地粘贴:
Go to https://example.com to log in.
如果我在 Python 中只打印那个字符串,我会得到:
In [100]: string
Out[100]: 'Go to\xc3\x82\xc2\xa0https://example.com\xc3\x82\xc2\xa0to log in.'
In [101]: URL_PATTERN.search(string).groups()
Out[102]: ('https://example.com\xc3\x82\xc2\xa0to', None, None, None, None)
我尝试匹配的字符串是str,而不是unicode。
如何修改这个正则表达式以不匹配这个字符?我尝试将\xc2\xa0 放入正则表达式末尾附近的^ 否定字符类中,但它仍然将URL 与空格字符匹配。
【问题讨论】:
-
您可能必须将
\u00A0添加到您拥有[^\s]的否定字符类中。此外,在 Python 2.x 中测试 Unicode 字符有点麻烦,因为您经常需要encode/decode。 -
@WiktorStribiżew 您可以添加您的评论作为答案,以便我接受吗?您的建议有效,但我还必须添加
\u00c2。我还添加了使用re.compile(ur'(?iu)...指定“unicode”模式
标签: python regex python-2.7