例如我有一个字符串:
mvn clean install
我想做什么 - 删除特定单词的所有重复项(仅当它们连续出现时)。结果:
my_str = 'my example example string contains example some text'
我尝试了下一个代码:
my example string contains example some text
或
import re
my_str = re.sub(' example +', ' example ', my_str)
但它不起作用。
我知道有很多关于my_str = re.sub('\[ example ]+', ' example ', my_str)
的问题,但我仍然无法正确地实现它。
答案 0 :(得分:3)
您需要创建一个组并量化它:
import re
my_str = 'my example example string contains example some text'
my_str = re.sub(r'\b(example)(?:\s+\1)+\b', r'\1', my_str)
print(my_str) # => my example string contains example some text
# To build the pattern dynamically, if your word is not static
word = "example"
my_str = re.sub(r'(?<!\w)({})(?:\s+\1)+(?!\w)'.format(re.escape(word)), r'\1', my_str)
请参阅Python demo
我添加了单词边界 - 通过原始代码中的空格来判断 - 预期整个单词匹配。
请参阅regex demo here:
\b
- 字边界(替换为(?<!\w)
- 在允许当前位置之前没有字词字符 - 在动态方法中,因为re.escape
也可能支持像{{1}这样的“字词”然后.word.
可能会阻止正则表达式匹配)\b
- 第1组(来自替换模式的(example)
):
\1
字example
- 一次或多次出现
(?:\s+\1)+
- 1+空格\s+
- 对第1组值的反向引用,即\1
字example
- 字边界(替换为\b
- 在允许当前位置后没有字词。)请记住,在Python 2.x中,如果需要使(?!\w)
字边界支持Unicode,则需要使用re.U
。
答案 1 :(得分:2)
正则表达式:\b(\w+)(?:\s+\1)+\b
或\b(example)(?:\s+\1)+\b
替换:\1
详细说明:
\b
在字边界处断言位置\w
匹配任何单词字符(等于[a-zA-Z0-9_]
)\s
匹配任何空格字符+
匹配一次且无限次\1
第1组。Python代码:
text = 'my example example string contains example some text'
text = re.sub(r'\b(\w+)(?:\s+\1)+\b', r'\1', text)
输出:
my example string contains example some text
答案 2 :(得分:1)
您也可以在纯Python(没有regex
)中执行此操作,方法是创建单词列表,然后生成新的string
- 应用您的规则。
>>> words = my_str.split()
>>> ' '.join(w for i, w in enumerate(words) if w != words[i-1] or i == 0)
'my example string contains example some text'
答案 3 :(得分:-1)
为什么不使用.replace函数:
my_str = 'my example example string contains example some text'
print my_str.replace("example example", "example")