import re
input_text = "hay alrededor de 4 coches el dia 7 del mes 5" #example 1
input_text = "Serian 4 unidades de mermelada para el dia 04 del 8 de este año 2023" #example 2
input_text = "Hay 10 unidades para el dia 15 del 12 y seran 9 ya para el 7 de noviembre" #example 3
input_text = "Hay 10 unidades para el 15 del 1º mes del año y seran alrededor de 9 para el 7º dia del mes de noviembre" #example 4
#for days
standard_number_of_digits_re_1 = r"(?:del dia|de el dia|el dia|del|de el|el)[\s|]*(\b\d{1}\b)"
standard_number_of_digits_re_2 = r"(\b\d{1}\b)[\s|]*º[\s|]*dia"
re_1_and_re_2 = r"(?:" + standard_number_of_digits_re_1 + r"|" + standard_number_of_digits_re_2 + r")"
#for months
#standard_number_of_digits_re_3 = re_1_and_re_2 + r"(?:del mes|de el mes|del|de el)[\s|]*(\b\d{1}\b)"
#standard_number_of_digits_re_4 = re_1_and_re_2 + r"(?:del mes|de el mes|del|de el)[\s|]*(\b\d{1}\b)[\s|]*(?:º[\s|]*mes del año|º[\s|]*mes)"
standard_number_of_digits_re_3 = r"(?:del mes|de el mes|del|de el)[\s|]*(\b\d)"
standard_number_of_digits_re_4 = r"(?:del mes|de el mes|del|de el)[\s|]*(\b\d)[\s|]*(?:º[\s|]*mes del año|º[\s|]*mes)"
#replacement with this conditions, and put '0' in front a day number only if it is one number and not two(or more numbers)
# example: '1' --> '01' or '10' --> '10'
input_text = re.sub(standard_number_of_digits_re_3, r"0\1", input_text)
input_text = re.sub(standard_number_of_digits_re_4, r"0\1", input_text)
input_text = re.sub(standard_number_of_digits_re_1, r"0\1", input_text)
input_text = re.sub(standard_number_of_digits_re_2, r"0\1", input_text)
print(repr(input_text)) #output
我遇到的问题是,正则表达式似乎不能正常工作,因为我不能进行替换,但在try 几个代码编辑器时,我注意到了这两件事:
- 在正则表达式调试器https://regex101.com/r/TfsKHZ/1中,正则表达式似乎捕获了正确的文本组,但即使在代码中,它们也失败了
- 在SublimeText编辑器中,当我将
r
放在"(?:"
前面时,整个行将立即被放置,就像它是一个字符串一样,尽管您可以看到这个字符串是如何用中间负责连接的操作符分隔的,但在StackOverflow中,该行显示正确.
我不知道这些观察结果在这些正则表达式的故障中是否重要,但出于某些我找不到的原因,正则表达式无法通过在前面放置一个0(如果适用)来提取要编辑的文本.
打印时,离开输出应如下所示:
"hay alrededor de 4 coches el dia 07 del mes 05" #for example 1
"Serian 4 unidades de mermelada para el dia 04 del 08 de este año 2023" #for example 2
"Hay 10 unidades para el dia 15 del 12 y seran 9 ya para el 07 de noviembre" #for example 3
"Hay 10 unidades para el 15 del 01º mes del año y seran alrededor de 9 para el 07º dia del mes de noviembre" #for example 4
我应该进行哪些修改才能获得这些结果?我认为问题出在正则表达式(\b\d{1}\b)
的这一部分
编辑过的代码
import re
input_text = "hay alrededor de 4 coches el dia 7 del mes 5" #example 1
#input_text = "Serian 4 unidades de mermelada para el dia 04 del 8 de este año 2023" #example 2
input_text = "Hay 10 unidades para el dia 15 del 12 y seran 9 ya para el 7 de noviembre" #example 3
#input_text = "Hay 10 unidades para el 15 del 1º mes del año y seran alrededor de 9 para el 7º dia del mes de noviembre" #example 4
#for days
standard_number_of_digits_re_1 = r"(?:del dia|de el dia|el dia|del|de el|el)[\s|]*(\b\d)"
standard_number_of_digits_re_2 = r"(\b\d)[\s|]*º[\s|]*dia"
#for months
standard_number_of_digits_re_3 = r"(?:del mes|de el mes|del|de el)[\s|]*(\b\d)"
standard_number_of_digits_re_4 = r"(?:del mes|de el mes|del|de el)[\s|]*(\b\d)[\s|]*(?:º[\s|]*mes del año|º[\s|]*mes)"
#replacement with this conditions, and put '0' in front a day number only if it is one number and not two(or more numbers)
# example: '1' --> '01' or '10' --> '10'
input_text = re.sub(standard_number_of_digits_re_3, r"0\1", input_text)
print(repr(input_text)) #output
input_text = re.sub(standard_number_of_digits_re_4, r"0\1", input_text)
print(repr(input_text)) #output
input_text = re.sub(standard_number_of_digits_re_1, r"0\1", input_text)
print(repr(input_text)) #output
input_text = re.sub(standard_number_of_digits_re_2, r"0\1", input_text)
print(repr(input_text)) #output
例如,在示例3中,问题就是:
'Hay 10 unidades para 015 012 y seran 9 ya para 07 de noviembre'
正确的输出是:
'Hay 10 unidades para 15 12 y seran 9 ya para 07 de noviembre'