检测正则表达式中的拉丁字符

3
我想在拉丁文本上应用正则表达式,并按照此问题中的解决方案进行操作:如何处理Python中正则表达式的重音字符?,他们建议在正则表达式前添加#字符。请注意保留HTML标记。
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”,带有点“前面的”空格,并删除标签“@aaa”。
但它产生了相同的输入文本:“@aaa bbb các. ddd”。
我错过了什么吗?

1
在你提供的那个问题中,答案并不是关于添加 #(这里使用的是 @),而是他们使用了 \wre.U 标志来使 \w 具有 Unicode 功能。你不能仅仅因为添加了一些标志就期望 [A-Za-z] 能够匹配 ł。请将你的 #[a-zA-Z_0-9]+ 替换为 @\w+ - Wiktor Stribiżew
你如何确保正则表达式能够检测到拉丁字符? - revo
@WiktorStribiżew,它有效!.. - Minions
1
在@WiktorStribiżew的精彩回答中,\w匹配[a-zA-Z0-9_](以及带有U标志的其他变体)。要使\w不匹配_,您可以使用[^\W_]。同样,要仅匹配[a-zA-Z]及其Unicode变体(不包括数字),可以使用[^\W_\d] - ctwheels
“非字符”指的是“非单词和非空格”字符,对吗?您可以使用 [^\w\s] 进行匹配。 - Wiktor Stribiżew
显示剩余4条评论
1个回答

1

当前代码存在几个问题:

  • 为匹配任何Unicode单词字符,请使用带有Unicode标志的\w(而不是[A-Za-z0-9_]
  • 在使用re.Ure.sub时,请记住在标志之前使用count参数(将其设置为0以匹配所有出现),或者只使用flags=re.U/flags=re.UNICODE
  • 为匹配任何非单词字符但空格,可以使用[^\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))

1
然后将'[^\w\s]+'替换为'[^\w\s]',以单个特殊字符匹配,而不是作为连续字符序列。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接