我在替换字符串时遇到问题:我想将所有外观从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 ?
答案 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?)?
-与eure
或eures
出现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)
在括号内更改heures
和h
的顺序,如下所示:
[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
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)
答案 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