在问题 here 之后,如果连字符未出现在美国邮政编码中,我将尝试替换它。
逻辑是:
- 不要匹配数字之间的连字符
- 匹配连字符
我尝试使用以下方法来实现此目的:
import re
p = re.compile(r'(?!\d+\-\d+)-') # regex here
test_str = "12345-4567 hello-you"
re.sub(p, " ", test_str)
- 预期输出:
12345-4567 你好
- 实际输出:
12345 4567 hello you
我做错了什么?
最佳答案
您可以使用
import re
p = re.compile(r'(?!(?<=\d)-\d)-')
test_str = "12345-4567 hello-you 45-year N-45"
print(re.sub(p, " ", test_str))
# => 12345-4567 hello you 45 year N 45
请参阅 Python demo 和 regex demo 。
(?!(?<=\d)-\d)-
正则表达式匹配 a
-
(?!(?<=\d)-\d)
- 字符串中不立即跟有-
(前面紧跟一个数字)的位置,后跟一个数字 -
-
- 连字符。
另一种方法是匹配和捕获邮政编码(例如字符串)以保留它们并在所有其他上下文中替换 -
:
re.sub(r'\b(\d{5}-\d{4})\b|-', r'\1 ', text)
请参阅 regex demo 和 Python demo 。
注意 \b(\d{5}-\d{4})\b
首先匹配单词边界位置并将其捕获到第 1 组中,然后匹配任意五个数字、连字符、四个数字,然后再次匹配单词边界。替换模式中的 \1
反向引用引用第 1 组中捕获的值。
关于python - 替换除两位数字之间的所有连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63887620/