如何修复Python正则表达式,实现指定规则下a m转am的替换?
修复Python正则替换代码,实现特定规则的"a m"替换
需求说明
需要修复现有正则表达式,实现:当字符串中的数字(标记为X)之后跟随符合规则的"a m"时,将"a m"替换为"am"。
具体匹配规则:
- 需要替换的"a m"必须前置数字X
- X与"a m"之间可包含以下内容的任意组合:
- 任意数量的空格
- 可选的冒号
- 可选的
hs、h.s或h.s.
现有代码
out = re.sub(r"(hs|h.s|h.s.)a m(\W|\b)", r"\1 am\2", out) print(repr(out))
输入示例
# example 1.1 colloquial_hour = "Cerca de las 2: hs a m, hay que salir antes de esas hs a m" # example 1.2 colloquial_hour = "A medida que avance cerca de la media noche 12: 04 hs a m. Deben ir a las 15 hs a m." # example 1.3 colloquial_hour = "A mmm... cerca de las 12: h.s a m, hay que salir antes de esas h.s. a m" # example 1.4 colloquial_hour = "A medida que avance cerca de las 12:04 hs. a m. Deben ir a las 15 h.s a m."
期望正确输出
# correct output for example 1.1 "Cerca de las 2: hs am, hay que salir antes de esas hs a m" # correct output for example 1.2 "A medida que avance cerca de la media noche 12: 04 hs am. Deben ir a las 15 hs am." # correct output for example 1.3 "A mmm... cerca de las 12: h.s am, hay que salir antes de esas h.s. a m" # correct output for example 1.4 "A medida que avance cerca de las 12:04 hs. am. Deben ir a las 15 h.s am."
修复后的代码及解释
修复后的正则替换代码
import re def fix_am_format(text): # 匹配数字后符合规则的"a m",替换为"am" return re.sub(r"(?<=\d)(?:\s*[:]?\s*(?:h\.?s\.?)?\s*)a m(?=\W|\b)", r"am", text)
正则规则拆解
(?<=\d):正向零宽断言,确保目标"a m"前面存在数字,这是触发替换的核心条件(?:\s*[:]?\s*(?:h\.?s\.?)?\s*):匹配数字与"a m"之间的允许内容(非捕获组,不保留匹配内容):\s*:匹配任意数量的空格[:]?:匹配可选的冒号(?:h\.?s\.?)?:匹配可选的hs/h.s/h.s.,\.?表示该位置的点号可选
a m(?=\W|\b):匹配目标"a m",并通过正向断言确保后面是非单词字符或单词边界,避免误替换其他场景的"a m"
测试验证
将输入示例代入函数,可得到符合预期的输出:
# 测试示例1.1 colloquial_hour = "Cerca de las 2: hs a m, hay que salir antes de esas hs a m" print(repr(fix_am_format(colloquial_hour))) # 输出:"Cerca de las 2: hs am, hay que salir antes de esas hs a m" # 测试示例1.2 colloquial_hour = "A medida que avance cerca de la media noche 12: 04 hs a m. Deben ir a las 15 hs a m." print(repr(fix_am_format(colloquial_hour))) # 输出:"A medida que avance cerca de la media noche 12: 04 hs am. Deben ir a las 15 hs am."
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

