【问题标题】:Detect latin characters in regex检测正则表达式中的拉丁字符
【发布时间】:2018-10-13 00:05:38
【问题描述】:

我想在拉丁文本上应用正则表达式,我遵循了这个问题中的解决方案:How to account for accent characters for regex in Python?,他们建议在正则表达式之前添加一个 # 字符。

def clean_str(string):
    string = re.sub(r"#(@[a-zA-Z_0-9]+)", " ", string, re.UNICODE)
    string = re.sub(r'#([^a-zA-Z0-9#])', r' \1 ', string, re.UNICODE)
    string = re.sub(r'#([^a-zA-Z0-9#])', r' ', string, re.UNICODE)
    string = re.sub(r'(\s{2,})', ' ', string, re.UNICODE)
    return string.lower().strip()

我的问题是,正则表达式可以检测拉丁字符,但文本上设置的正则表达式没有应用任何内容。

示例: 如果我有类似“@aaa bbb các. ddd”这样的文字。

它应该类似于“bbb các .ddd”,在“DOT”之前带有空格并删除标签“@aaa”。

但它产生相同的输入文本!:“@aaa bbb các.ddd”

我错过了什么吗?

【问题讨论】:

  • 在您链接到的那个问题中,答案不是添加#(这里有@),而是他们使用\wre.U 标志来制作\w Unicode知道的。你不能仅仅因为你添加了一些标志就指望[A-Za-z] 匹配ł。将您的 #[a-zA-Z_0-9]+ 替换为 @\w+
  • 您如何确保正则表达式能够检测拉丁字符
  • @WiktorStribiżew ,它有效! ..
  • 添加到@WiktorStribiżew 的精彩回复中,\w 匹配[a-zA-Z0-9_](以及带有U 标志的其他变体)。要让\w_ 不匹配,您可以使用[^\W_]。同样,要仅匹配 [a-zA-Z] 及其 Unicode 变体(无数字),您可以使用 [^\W_\d]
  • @revo ,你可以测试一下,它可以工作

标签: python regex


【解决方案1】:

您在当前代码中有几个问题:

  • 要匹配任何 Unicode 字字符,请使用带有 Unicode 标志的 \w(而不是 [A-Za-z0-9_]
  • 当使用re.Ure.sub 时,请记住在标志之前使用count 参数(将其设置为0 以匹配所有出现),或者只使用flags=re.U/ @ 987654327@
  • 要匹配除空格以外的任何非单词字符,您可以使用[^\w\s]
  • 当您想用整个匹配替换时,您不必用(...) 包装整个模式,只需确保在替换模式中使用\g<0> 反向引用即可。

查看清理字符串的更新方法:

>>> def clean_str(s):
...     s = re.sub(r'@\w+', ' ', s, flags=re.U)
...     s = re.sub(r'[^\w\s]', r' \g<0>', s, flags=re.U)
...     s = re.sub(r'\s{2,}', ' ', s, flags=re.U)
...     return s.lower().strip()
...
>>> print(clean_str(s))
puta asquerosa cállate . sino

【讨论】:

  • 然后将 '[^\w\s]+' 替换为 '[^\w\s]' 以单独匹配特殊字符,而不是作为连续字符序列。
猜你喜欢
  • 2021-04-13
  • 2018-06-21
  • 2018-09-15
  • 2016-05-13
  • 2015-02-26
  • 2015-07-09
  • 2017-04-04
  • 2013-01-27
  • 2014-12-20
相关资源
最近更新 更多