python 如何仅在检测到特定正则表达式模式的情况下使用re.sub对字符串中的数据进行重新排序,而在其他情况下不进行重新排序

wfypjpf4  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(133)
import re

#example
input_text = 'Alrededor de las 00:16 am o las 23:30 pm , quizas cerca del 2022_-_02_-_18 llega el avion, pero no a las (2022_-_02_-_18 00:16 am), de esos hay dos (22)'

identify_time_regex = r"(?P<hh>\d{2}):(?P<mm>\d{2})[\s|]*(?P<am_or_pm>(?:am|pm))"

restructuring_structure_00 = r"(\g<hh>----\g<mm>----\g<am_or_pm>)"

#replacement
input_text = re.sub(identify_regex_01_a, restructuring_structure_00, input_text)

print(repr(input_text)) # --> output

我必须修改这个正则表达式identify_time_regex,以便它提取小时数,但前提是它必须在如下结构(2022_-_02_-_18 00:16 am)中,该结构可以概括为:
r"(\d*_-_\d{2}_-_\d{2}) " + identify_time_regex
我需要的输出,您可以看到只有那些小时被修改,其中没有日期之前

input_text = 'Alrededor de las 00----16----am o las 23----30----pm , quizas cerca del 2022_-_02_-_18 llega el avion, pero no a las (2022_-_02_-_18 00:16 am), de esos hay dos (22)'
cgh8pdjw

cgh8pdjw1#

您可以使用

import re

input_text = 'Alrededor de las 00:16 am o las 23:30 pm , quizas cerca del 2022_-_02_-_18 llega el avion, pero no a las (2022_-_02_-_18 00:16 am), de esos hay dos (22)'
identify_time_regex = r"(\b\d{4}_-_\d{2}_-_\d{2}\s+)?(?P<hh>\d{2}):(?P<mm>\d{2})[\s|]*(?P<am_or_pm>[ap]m)"
restructuring_structure_00 = lambda x: x.group() if x.group(1) else fr"{x.group('hh')}----{x.group('mm')}----{x.group('am_or_pm')}"
input_text = re.sub(identify_time_regex, restructuring_structure_00, input_text)
print(input_text)
# Alrededor de las 00----16----am o las 23----30----pm , quizas cerca del 2022_-_02_-_18 llega el avion, pero no a las (2022_-_02_-_18 00:16 am), de esos hay dos (22)

请参阅Python demo
逻辑如下:如果(\b\d{4}_-_\d{2}_-_\d{2}\s+)?可选捕获组匹配,则替换是整个匹配(即,不发生替换),并且如果不匹配,则发生替换。
restructuring_structure_00必须是lambda表达式,因为在替换之前需要计算匹配结构。
\b\d{4}_-_\d{2}_-_\d{2}\s+模式匹配单词边界、四位数字、_-_、两位数字、_-_、两位数字以及一个或多个空格。

相关问题