正则表达式可删除除两个单词之间的所有连字符

时间:2020-05-17 23:57:29

标签: python regex

我正在清理文本,我想删除所有连字符和特殊字符。除了两个单词之间的连字符,例如:tic-tacspopcorn-flavoured

我写了下面的正则表达式,但是它删除了每个连字符。

text='popcorn-flavoured---'
new_text=re.sub(r'[^a-zA-Z0-9]+', '',text)
new_text 

我希望输出为:

popcorn-flavoured

4 个答案:

答案 0 :(得分:4)

您可以替换正则表达式的匹配项

-(?!\w)|(?<!\w)-

带有空字符串。

Regex demo << / sup>¯\ _(ツ)_ /¯> Python demo

正则表达式将匹配在字词之前和之后都没有的连字符。

Python的正则表达式引擎执行以下操作。

-        match '-'
(?!\w)   the previous character is not a word character
|
(?<!\w)  the following character is not a word character
-        match '-'

(?!\w)负前瞻(?<!\w)负向后看

答案 1 :(得分:1)

您可以使用findall()来获取符合您条件的部分。

new_text = re.findall('[\w]+[-]?[\w]+', text)[0]

与其他输入一起玩。

答案 2 :(得分:1)

作为替代方案,您可以捕获单词字符之间的连字符并将该组保留在替换字符中。通过交替使用,您可以匹配要删除的连字符。

(\w+-\w+)|-+

说明

  • (\w+-\w+)捕获组1,匹配1个以上的字符,连字符和1个以上的字符
  • |
  • -+匹配连字符1次以上

Regex demo | Python demo

示例代码

import re

regex = r"(\w+-\w+)|-+"
test_str = ("popcorn-flavoured---\n"
    "tic-tacs")

result = re.sub(regex, r"\1", test_str)
print (result)

输出

popcorn-flavoured
tic-tacs

答案 3 :(得分:0)

您可以使用

p = re.compile(r"(\b[-]\b)|[-]")
result = p.sub(lambda m: (m.group(1) if m.group(1) else ""), text)

测试

使用:

text='popcorn-flavoured---'

输出(结果):

popcorn-flavoured

说明

此模式检测两个单词之间的连字符:

(\b[-]\b)

此模式可检测所有连字符

[-]

正则表达式替换

p.sub(lambda m: (m.group(1) if m.group(1) else " "), text)

当检测到两个单词m.group(1)之间存在连字符时,我们将它们保持不变

else "")

由[-]触发模式时发生,然后我们用“”代替连字符。