如何修改此正则表达式以匹配不间断的空格?

时间:2016-03-17 18:33:49

标签: python regex python-2.7

我正在使用John Gruber's regular expression来尝试匹配文档中的网址。

我用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。

1 个答案:

答案 0 :(得分:1)

为避免将URL与不间断空格匹配,您需要将\u00A0添加到否定字符类[^\s],并在编译模式时传递re.U标志:

URL_PATTERN = re.compile(ur'(?i)\b(https?://(?:[^\u00A0\s()<>]+|\(([^\u00A0\s()<>]+|(\([^\u00A0\s()<>]+\)))*\))+(?:\(([^\u00A0\s()<>]+|(\([^\u00A0\s()<>]+\)))*\)|[^\u00A0\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))', re.U)
                                                 ^^^^^^              ^^^^^^              ^^^^^^                           ^^^^^^            ^^^^^^                  ^^^^^^                                                            ^^^^