我的正则表达式返回仅需要获取日期范围的项目列表。该列表并不总是在特定索引处具有日期范围。
我尝试先将列表转换为字符串,然后仅提取日期范围:
possible_billing_periods = list(re.findall(r'Billing Period: (.*)|Billing period: (.*)|Billing Period (.*)|Billing period (.*)|period (.*)|period: (.*)', data))
billing_period = str(possible_billing_periods)
for k in billing_period.split("\n"):
if k != ['(A-Za-Z0-9)']:
billing_period_2 = re.sub(r"[^a-zA-Z0-9]+", ' ', k)
print(possible_billing_periods)
>>> [('', '', '', '', 'Tel', ''), ('21-june-2018 - 25-September-2018', '', '', '', '', '')]
预期结果:21-june-2018 25-September-2018
得到的结果:Tel 21 june 2018 25 September 2018
样本数据:
2018年8月28日开始索引:B1 0
2018年8月28日开始索引:E1 0
结算周期:2018年6月21日至2018年9月25日
预计下一次阅读:2018年12月25日
答案 0 :(得分:0)
根据样本数据的大小,正则表达式可能不是检索信息的最佳方法(基于性能)。
假设所需的日期字符串始终位于以'Billing Period'
开头的行中,则可以尝试如下操作:
sample_data = """28 August2018 Start Index: B1 0
28 August 2018 Start Index: E1 0
Billing Period: 21-june-2018 - 25-September-2018
Expected next reading: 25 December 2018"""
billing_periods = list()
line_start = {'Billing':0, 'period':0, 'period:':0}
for line in sample_data.split('\n'):
if line.split()[0] in line_start:
billing_periods.append((line.split()[-3], line.split()[-1]))
print(billing_periods)
输出:
[('2018年6月21日','2018年9月25日')]
字典line_start
使您可以定义一些可能的行起始字符。
答案 1 :(得分:0)
我猜数据来自文件,因此最容易逐行处理。这是处理文件的常用方法的伪代码:
<?php
function change_date_format($givenDate,$format)
{
$date = date_create_from_format($format, $givenDate);
echo date_format($date, 'Y-m-d');
}
print_r(change_date_format('08/02/2012','d/m/Y'));
echo PHP_EOL;
print_r(change_date_format('08/02/2012','m/d/Y'));
根据示例数据,我们关心的行以“结算期:”的某些变化开头。这是一个正则表达式,用于查找以示例代码中的任何变体开头的行。开头的x等效于re.VERBOSE标志。它告诉正则表达式编译器忽略空格,以便我可以展开正则表达式的各个部分并用一些注释解释发生了什么。
for each line in the file:
if it is a line we care about:
process the line
现在,如果帐单周期正则表达式匹配,那么我们需要找到一个日期范围。根据样本数据,日期范围是两个日期,中间用“-”分隔。日期是1-2位的日期,月份名称和4位的年份,中间用'-'分隔。这是为日期范围建立正则表达式的一种方法:
billing_period_re = re.compile(r"""\
(?xi) # ignorecase and verbose
^ # match at the begining of the string
\s*
(?:Billing)? # optional Billing. (?: ...) means don't save the group
\s*
Period
\s*
:? # optional colon
\s*
""")
将它们放在一起
day = r"\d{1,2}"
month = r"(?:january|february|march|april|may|june|july|august|september|october|november|december)"
year = r"\d{4}"
date = rf"{day}-{month}-{year}"
date_range_re = re.compile(rf"(?i)(?P<from>{date}) - (?P<to>{date})")