替换字符串中的问题

我有一个替换字符串的问题:我想将所有外观从2h / 2h / 2 heure / 2heure / 2 heures / 2heures更改为#hour。我试过了:


text = "I should leave the house at 16h45 but I am late and I should not be arriving between 2 h or 3h or maybe 4heures"

hour = re.compile(r'[0-9]+\s?(h|heures?)([0-9]+)?')

replaces = hour.sub('#hour', text)

print(replaces)

输出:


我应该在#hour离开家,但是我迟到了,我不应该在#hour或#hour或#houreures之间到达


良好的输出:


我应该在#hour离开家,但是我迟到了,我不应该在#hour或#hour或#hour之间到达


我该如何解决#houreures这个问题?


ibeautiful
浏览 148回答 3
3回答

料青山看我应如是

该h替代匹配h的heures和heures?替代甚至没有测试。交换替代方案可以解决问题,但是最好使用可选的非捕获组(请参见下面的解决方案)。建议不要在模式中的捕获括号中删除它们(或者,如果要使用替换,则将其转换为非捕获组)。此外,该([0-9]+)?模式可以简化为[0-9]*。您可以使用[0-9]+\s?h(?:eures?)?[0-9]*见正则表达式演示细节[0-9]+ -一个或多个数字\s? -1或0个空格h-h一封信(?:eures?)?-与1个或0个匹配项发生eure或匹配的可选非捕获组eures[0-9]* -0或更多数字。参见Python演示:import retext = "I should leave the house at 16h45 but I am late and I should not be arriving between 2 h or 3h or maybe 4heures"hour = re.compile(r'[0-9]+\s?h(?:eures?)?[0-9]*')replaces = hour.sub('#hour', text)print(replaces)# => I should leave the house at #hour but I am late and I should not be arriving between #hour or #hour or maybe #hour

收到一只叮咚

更改的顺序heures和h括号,像这里面:[0-9]+\s?(heures?|h)([0-9]+)? 应该管用。在情况下(h|heures?),你是说,如果h没有找到,然后看是否heures存在。无论何时heures存在,事物h都会始终存在(它的第一个字符heures)。因此,您需要更改顺序。您应该先搜索heures,如果不存在,则搜索h。因此,替换 (h|heures?)为即可(heures?|h)解决问题。

婷婷同学_

您需要切换交替,因为第一部分中的h首先被匹配。例如4heures,您的正则表达式匹配一个或多个数字\d+。然后在交替中(h|heures?)它可以匹配hfrom heures。在替换匹配的4h将被替换#hour导致#houreures[0-9]+\s?(heures?|h)([0-9]+)?import retext = "I should leave the house at 16h45 but I am late and I should not be arriving between 2 h or 3h or maybe 4heures"hour = re.compile(r'[0-9]+\s?(heures?|h)([0-9]+)?')replaces = hour.sub('#hour', text)print(replaces)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python