我在创建一个正则表达式来提取与时间XX:XX am or pm相关的短语时遇到了问题

import re

hh, mm, am_pm = "", "", "" #each hour group element in str format
times_output = [] #list that must accumulate all time in "XX:XX am or pm" format, 'X' is a int value

伪正则表达式模式(对于这种类型的示例输入字符串)

"sense" \s* entre las \s* "XX:XX am or pm" \s* y las \s* "XX:XX am or pm"

"XX:XX am or pm" ---> "sense"
"XX:XX am or pm" ---> "sense"
"sense" a las "XX:XX am or pm"

"XX:XX am or pm" ---> "sense"
"sense" a las "XX:XX am or pm", a las "XX:XX am or pm" o a las "XX:XX am or pm"

"XX:XX am or pm" ---> "sense"
"XX:XX am or pm" ---> "sense"
"XX:XX am or pm" ---> "sense"
(...|.|,|;) \s* "sense1" \s* (a las|de las|) \s* "XX:XX am or pm" \s* "sense2"

"XX:XX am or pm" ---> "sense1" + "sense2"
"22:00 pm"       ---> "ya que a las" + "empieza el show"

在这种情况下,"ya que"和"a las"将被移除

Regex pattern to extract times from the input sentence no matter what is before or after the times pattern

Example 1:

input_text = "puede ser peligroso salir entre las 18:00 pm y las 20:00 pm hs, por ello yo pienso que seria mejor salir a las 21:00 pm, a las 21:15 pm o a las 21:30 pm ya que a las 22:00 pm empezaria el show"

#sense_pattern = r"(?P()\s.+?)" #THE REGEX THAT I NEED
civil_time_pattern = r'(\d{1,2})[\s|:]*(\d{0,2})\s*(am|pm)?'

#civil_time_unit_list = re.search(civil_time_pattern, input_text_all_in_minus)
civil_time_unit_list = re.findall(civil_time_pattern, input_text_all_in_minus)

在这种情况下,这是更重要的only for the time regex

try:
    hh = civil_time_unit_list[0][0]
    if (hh == ""): hh = "00"
except IndexError: hh = "00"
try:
    mm = civil_time_unit_list[0][1]
    if (mm == ""): mm = "00"
except IndexError: mm = "00"
try:
    am_pm = civil_time_unit_list[0][2]
    if (am_pm == ""): am_pm = "am"
except IndexError: am_pm = "am"

time_output = (hh + ":" + mm + " " + am_pm).strip()
#remove unnecessary connectors in the <<sense>>
sense = sense.replace("entre las", "")
sense = sense.replace("y las", "")
sense = sense.replace("entre las", "")
sense = sense.replace("a las", "")
sense = sense.replace("ya que", "")

然后,只需创建带有时间表名称的文件,并在其中写入相关的含义

time_output_file = time_output + ".txt"
with open(time_output_file, 'w') as f:
    f.write(sense)

最后,文件应该如下所示(对于本例)……

18:00 pm.txt ----> 'puede ser peligroso salir'
20:00 pm.txt ----> 'puede ser peligroso salir'
21:00 pm.txt ----> 'por ello yo pienso que seria mejor salir'
21:15 pm.txt ----> 'por ello yo pienso que seria mejor salir'
21:30 pm.txt ----> 'por ello yo pienso que seria mejor salir'
22:00 pm.txt ----> 'empezaria el show'

推荐答案

这是一个棘手的小问题.一旦你go 掉了连接的短语,那么就只需要按时间"拆分"字符串了.尽管它不会处理所有奇怪的输入变化,但它似乎主要做您想做的事情.尤其是感觉总是先于时间,所以似乎没有任何理由应该最后一次使用《Empezaria el show》.

import re
sense = "puede ser peligroso salir entre las 18:00 pm y las 20:00 pm hs, por ello yo pienso que seria mejor salir a las 21:00 pm, a las 21:15 pm o a las 21:30 pm ya que a las 22:00 pm empezaria el show"

sense = sense.replace("entre las", "") \
        .replace("y las", "") \
        .replace("o a las","") \
        .replace("a las", "") \
        .replace(",","")

civil_time_pattern = r'(\d{1,2}:\d{1,2}\s\s*(?:am|pm))'
for m in re.split(civil_time_pattern, sense):
    m = m.strip()
    if m:
        if m[0].isdigit():
            print(f"Write '{content}' to {m}.txt")
        else:
            content = m

输出:

Write 'puede ser peligroso salir' to 18:00 pm.txt
Write 'puede ser peligroso salir' to 20:00 pm.txt
Write 'hs por ello yo pienso que seria mejor salir' to 21:00 pm.txt
Write 'hs por ello yo pienso que seria mejor salir' to 21:15 pm.txt
Write 'hs por ello yo pienso que seria mejor salir' to 21:30 pm.txt
Write 'ya que' to 22:00 pm.txt

Python相关问答推荐

如何找到满足各组口罩条件的第一行?

如何在python polars中停止otherate(),当使用when()表达式时?

avxspan与pandas period_range

在Python中动态计算范围

我对我应该做什么以及我如何做感到困惑'

导入...从...混乱

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

使用特定值作为引用替换数据框行上的值

下三角形掩码与seaborn clustermap bug

如何防止Pandas将索引标为周期?

在Docker容器(Alpine)上运行的Python应用程序中读取. accdb数据库

我对这个简单的异步者的例子有什么错误的理解吗?

在numpy数组中寻找楼梯状 struct

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

在round函数中使用列值

查找查找表中存在的列值组合

在Pandas 中以十六进制显示/打印列?

Pandas:新列,从列表中采样,基于列值

判断字典中是否有多个值对

使用OpenPYXL切换图表上的行/列