我正在清理文本,我想删除所有连字符和特殊字符。除了两个单词之间的连字符,例如:tic-tacs
,popcorn-flavoured
。
我写了下面的正则表达式,但是它删除了每个连字符。
text='popcorn-flavoured---'
new_text=re.sub(r'[^a-zA-Z0-9]+', '',text)
new_text
我希望输出为:
popcorn-flavoured
答案 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次以上示例代码
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 "")
由[-]触发模式时发生,然后我们用“”代替连字符。