【问题标题】:How to modify this regular expression to not match a non-breaking space?如何修改此正则表达式以不匹配不间断空格?
【发布时间】: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


【解决方案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)
                                                 ^^^^^^              ^^^^^^              ^^^^^^                           ^^^^^^            ^^^^^^                  ^^^^^^                                                            ^^^^

【讨论】:

  • 我还得加\u00c2
  • 它代表Â,这通常是一个损坏的不间断空间。
  • @WiktorStribiżew 它没有损坏。这就是encoded in UTF-8 的不间断空间。
  • @Piotr:在本地化行业,当客户收到带有Â 的翻译而不是文本中的空格时,他们会说“您为什么提供损坏的翻译”? 从普通用户的角度来看,这是损坏的文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多