替换字符串中的问题

时间:2018-07-25 16:29:45

标签: python regex python-3.x

我在替换字符串时遇到问题:我想将所有外观从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

4 个答案:

答案 0 :(得分:2)

h替代项与h中的heures匹配,heures?替代项甚至没有经过测试。交换替代方案可以解决此问题,但是最好使用可选的非捕获组(请参见下面的解决方案)。

模式中不需要捕获括号,建议删除它们(或者,如果要使用替代,则转换为非捕获组)。

此外,([0-9]+)?模式可以简化为[0-9]*

您可以使用

[0-9]+\s?h(?:eures?)?[0-9]*

请参见regex demo

详细信息

  • [0-9]+-一个或多个数字
  • \s?-1或0个空格
  • h-一封h字母
  • (?:eures?)?-与eureeures出现1或0次的可选非捕获组
  • [0-9]*-0或更多数字。

请参见Python demo

import re
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(?: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

答案 1 :(得分:2)

在括号内更改heuresh的顺序,如下所示:

[0-9]+\s?(heures?|h)([0-9]+)?应该可以工作。

对于(h|heures?),您是说如果找不到h,则查看是否存在heures。问题是,每当heures存在时,h将始终存在(其heures的第一个字符)。因此,您需要更改顺序。您应该首先搜索heures,如果不存在,请然后搜索h。因此,将(h|heures?)替换为(heures?|h)可解决此问题。

答案 2 :(得分:1)

您需要切换alternation,因为第一部分中的h首先匹配。

例如在4heures中,您的正则表达式与数字\d+匹配一次或多次。然后,在交替(h|heures?)中,它可以与h中的heures相匹配。在替换中,匹配的4h将被替换为#hour,从而得到#houreures

[0-9]+\s?(heures?|h)([0-9]+)?

import re

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?(heures?|h)([0-9]+)?')
replaces = hour.sub('#hour', text)
print(replaces)

Demo

答案 3 :(得分:1)

在线演示here

import re

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"

s = re.sub(r'\d+\s*[h]?(eure)*[s]?\d*', '#hour', text)
print(s)

输出:

I should leave the house at #hour but I am late and I should not be arriving between #hour or #hour or maybe #hour