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中,正则表达式似乎捕获了正确的文本组,但即使在代码中,它们也失败了

introducir la descripción de la imagen aquí

  • 在SublimeText编辑器中,当我将r放在"(?:"前面时,整个行将立即被放置,就像它是一个字符串一样,尽管您可以看到这个字符串是如何用中间负责连接的操作符分隔的,但在StackOverflow中,该行显示正确.

introducir la descripción de la imagen aquí

我不知道这些观察结果在这些正则表达式的故障中是否重要,但出于某些我找不到的原因,正则表达式无法通过在前面放置一个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'

推荐答案

\d{1}之后摆脱\b.Python认为º是一个单词字符,所以7º之间没有单词边界.您不需要匹配单词边界,因为regexp只允许在数字和º之间使用空格或|.

也不需要{1}英镑.除非量化,否则所有模式都匹配1次,因此{1}次是多余的.

(\b\d)[\s|]*º[\s|]*dia

https://regex101.com/r/84QDbp/1

Python相关问答推荐

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

有没有一种方法可以从python的pussompy比较结果中提取文本?

Odoo 16使用NTFS使字段只读

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

改进大型数据集的框架性能

计算天数

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

合并帧,但不按合并键排序

Pandas Data Wrangling/Dataframe Assignment

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

寻找Regex模式返回与我当前函数类似的结果

为什么'if x is None:pass'比'x is None'单独使用更快?

Gekko中基于时间的间隔约束

使用字典或列表的值组合

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?

大型稀疏CSR二进制矩阵乘法结果中的错误

具有不同坐标的tkinter canvs.cocords()和canvs.moveto()

为什么在安装了64位Python的64位Windows 10上以32位运行?