单词的正则表达式不包含西里尔字母

regex for words does not containing Cyrillic letters

我想从不包含至少一个西里尔字母的任何单词中清除字符串(单词我的意思是字符串的一部分被空格字符分割)

我试过 line = re.sub(' *^[^а-яА-Я]+ *', ' ', line) 其中 [а-яА-Я] 是一组西里尔字母,但是在处理字符串时

 des поместья, de la famille Buonaparte. Non, je vous préviens que si vous

它returns

поместья, de la famille Buonaparte. Non, je vous préviens que si vous

而不仅仅是

поместья

一个选项是匹配 1 次或多次不在 а-яА-Я 范围内的字符,同时排除匹配的白色 space 字符添加 [^а-яА-Я\s]+

负环视 (?<!\S)(?!\S) 向左和向右断言白色 space 边界。

替换为空字符串时,可能会有双 spaced 间隙,您必须将其替换为单个 space.

如果不想匹配结尾的逗号,可以使用 strip 并添加要删除的字符。

查看匹配项 regex demo

例如:

import re

s = " des поместья, de la famille Buonaparte. Non, je vous pr&#233;viens que si vous"
pattern = r"(?<!\S)[^а-яА-Я\s]+(?!\S)"
print(re.sub(pattern, "", s).strip(', '))

输出

поместья

您想保留任何 non-whitespace 个至少包含一个西里尔字符的块。

您可以 str.split() 字符串并使用 unicodedata 检查是否至少有一个字符是西里尔字母,并且只保留那些“单词”:

import unicodedata as ud
result = ' '.join([word for word in text.split() if any('CYRILLIC' in ud.name(c) for c in word)])
print(result) # => поместья,

如果您还需要删除任何标点符号,请使用 Best way to strip punctuation from a string:

中的任何解决方案
import string
result = ' '.join([word.translate(str.maketrans('', '', string.punctuation)) for word in text.split() if any('CYRILLIC' in ud.name(c) for c in word)])
print(result) # => поместья

Python demo online详情:

  • [word.translate(str.maketrans('', '', string.punctuation)) for word in text.split() if any('CYRILLIC' in ud.name(c) for c in word)] - 列表理解
    • text.split()text 分成 non-whitespace 个块
    • if any('CYRILLIC' in ud.name(c) for c in word) - 条件检查 word 是否包含至少一个西里尔字符
    • word.translate(str.maketrans('', '', string.punctuation)) - 如果上述条件为 True,则采用 word 并从中去除标点符号
  • ' '.join(...) - 将列表项连接成一个 space-separate 字符串。