我有以下文本:
text = "upi xxxxxxxxxx manoj jayant xxx xxxxxxx532kvblhii"
我正在尝试去除只包含x
的重复模式,以获得如下输出:
out = "upi manoj jayant xxxxxxx532kvblhii"
我使用了以下正则表达式,但是结果不正确。
re.sub('[x]', '', text)
out = "upi manoj jayant 532kvblhii"
请帮我修正我的正则表达式。
使用单词边界来表示完全由x
组成的单词:
text = "upi xxxxxxxxxx manoj jayant xxx xxxxxxx532kvblhii"
out = re.sub(r'\s*\bx+\b\s*', ' ', text)
print(out.strip())
这将打印:
upi manoj jayant xxxxxxx532kvblhii
xxx
作为整个单词匹配。我们还会消耗两端的所有空格,并替换为一个空格,以保持其与周围其他单词的分离。这样做存在一个边缘情况,可能会在输出的开头和结尾留下额外的空格,我们会将其去除。# Without regex:
text = "upi xxxxxxxxxx manoj jayant xxx xxxxxxx532kvblhii"
print( " ".join([x for x in text.split() if x != len(x) * x[0] ]) )
# => upi manoj jayant xxxxxxx532kvblhii
# With regex:
import re
print( re.sub(r'\s*\bx+\b', '', text).lstrip() )
upi manoj jayant xxxxxxx532kvblhii
无正则解决方案详细信息
text.split()
通过空格分割字符串if x != len(x) * x[0]
的意思是,我们丢弃所有包含与单词中字符数相同数量的第一个字符的单词。正则表达式详细信息
\s*
- 零个或多个空格\b
- 单词边界x+
- 一个或多个x
字符\b
- 单词边界。请注意,只有当xxx
单词出现在字符串开头并且可能存在不受欢迎的前导空格时,才需要使用.lstrip()
。