繁体   English   中英

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

[英]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

它返回

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

而不仅仅是

поместья

一种选择是匹配 1 个或多个不在 а-яА-Я 范围内的字符,并排除添加[^а-яА-Я\s]+匹配空白字符

负环视(?<!\S)(?!\S)将空白边界断言到左侧和右侧。

替换为空字符串时,可能会有双倍间距,您必须将其替换为一个空格。

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

请参阅匹配的正则表达式演示

例如:

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(', '))

Output

поместья

您希望保留其中至少包含一个西里尔字符的任何非空白块。

您可以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 演示 详情

  • [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拆分为非空白块
    • if any('CYRILLIC' in ud.name(c) for c in word) - 条件检查word是否包含至少一个西里尔字符
    • word.translate(str.maketrans('', '', string.punctuation)) - 如果上述条件为True ,则获取word并从中删除标点符号
  • ' '.join(...) - 将列表项连接成单个空格分隔的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM