我正在使用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。
答案 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)
^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^