正则表达式用于查找后跟某些字符的数字

2024-04-24 20:59:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一个文本字段,其中包含有关用于计划目的的时间的信息。因为它是一个文本字段,所以数据是非结构化的,并且有许多不同的格式。数据示例包括:

  • 周一至周三下午6-7:30
  • 周二/周四5:00-6:30
  • 下午3:30-7:00
  • 第4-5页

因此,我试图编写一个解析器,将这些转换成可用的数据点。我现在正在处理时间组件。为了构造数据并能够将其传递到dateutil解析器中,我想一直“填充”。6将变成6:00,7将变成7:00等等。为此,我尝试使用正则表达式:

reg = re.compile('[\d]([^:]|$)')

这样做的目的是得到任何一个数字,要么后面没有a:,要么在行尾。但是,我意识到这会得到太多的数据点,因为在第一个示例中,它会得到7:30的“3”和7:30的0。你知道吗

将这些数据转换成可用格式的更好方法是什么?你知道吗


Tags: 数据文本目的re信息解析器示例格式
3条回答

我想用占位符代替正确的时间后,找到错误的时间会容易得多。然后我们可以更正错误的时间格式,然后再次用实际时间替换占位符

这是一个简单的实现,你可以调整它来满足你的需要

import re

texts = ["Mon-Wed 6-7:30pm",
"Tuesday/Thurs 5:00 - 6:30",
"M/T/W 3:30 -7",
"F 4-5",]

def get_placeholder_replacer(replaced_strings):
    def replace_with_placeholder(x):
        replaced_strings.append(x[0])
        return "{}"
    return replace_with_placeholder


ptrn_correct_time = re.compile(r"\d+:\d+")
ptrn_incorrect_time = re.compile(r"\d{1,2}")

for text in texts:
    replaced_strings = []
    placeholder_replacer = get_placeholder_replacer(replaced_strings)
    new_text = ptrn_correct_time.sub(placeholder_replacer,text)
    new_text = ptrn_incorrect_time.sub(lambda x: "{}:00".format(x[0]), new_text)

    print(new_text.format(*replaced_strings))

## Output
# Mon-Wed 6:00-7:30pm
# Tuesday/Thurs 5:00 - 6:30
# M/T/W 3:30 -7:00
# F 4:00-5:00

我将采用两阶段的方式,利用re.split的一个有趣特性,示例数据:

line1 = 'Mon-Wed 6-7:30pm'
line2 = 'Tuesday/Thurs 5:00 - 6:30'
line3 = 'M/T/W 3:30 -7'
line4 = 'F 4-5'

功能:

def add_zeros(line):
    parts = re.split(r'(\d{1,2}:\d{1,2})',line)
    parts[::2] = [re.sub(r'(\d{1,2})',r'\1:00',p) for p in parts[::2]]
    return ''.join(parts)

用法:

print(add_zeros(line1)) # Mon-Wed 6:00-7:30pm
print(add_zeros(line2)) # Tuesday/Thurs 5:00 - 6:30
print(add_zeros(line3)) # M/T/W 3:30 -7:00
print(add_zeros(line4)) # F 4:00-5:00

说明:

我给re.sub组中的第一个参数。re.split给出了一个list,奇数索引元素是分隔符。根据我在re.split中使用的模式,分隔符是“就绪”时间(不需要零填充)。然后我在列表的每个偶数索引元素(非“就绪”小时)上使用re.sub,将每1或2位数字视为一个小时,并将其替换为紧跟:00的数字

您可以使用负向后看和负向前看(?<!(:)\d)\d(?!(:|\d))https://regex101.com/r/nAQh3e/4 这将挑选出之前或之后没有数字,并且还没有:的数字

相关问题 更多 >