python - 替换除两位数字之间的所有连字符

标签 python regex

在问题 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 demoregex demo

(?!(?<=\d)-\d)- 正则表达式匹配 a

  • (?!(?<=\d)-\d) - 字符串中不立即跟有 -(前面紧跟一个数字)的位置,后跟一个数字
  • - - 连字符。

另一种方法是匹配和捕获邮政编码(例如字符串)以保留它们并在所有其他上下文中替换 -:

re.sub(r'\b(\d{5}-\d{4})\b|-', r'\1 ', text)

请参阅 regex demoPython demo

注意 \b(\d{5}-\d{4})\b 首先匹配单词边界位置并将其捕获到第 1 组中,然后匹配任意五个数字、连字符、四个数字,然后再次匹配单词边界。替换模式中的 \1 反向引用引用第 1 组中捕获的值。

关于python - 替换除两位数字之间的所有连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63887620/

相关文章:

java - 如何在wordcount hadoop中用逗号、空格、句点(.)、制表符(\t)、括号()、方括号[]和大括号({})字符分隔单词?

Python NLTK 朴素贝叶斯分类器 : What is the underlying computation that this classifier uses to classifiy input?

python - bufsize must be an integer error while grepping a message

javascript - 替换功能不替换

php - 如何从此网址中提取 YouTube ID

javascript - 是否可以在 1 个 Regex 表达式中进行 2 个替换操作?

Python:如何为子目录中的所有源文件运行 unittest.main()?

python - 如何获取pip安装路径 `data_files` ?

python - 根据差异对列表中最近的元素进行分组

regex - 使用正则表达式限制响应中的单词数