首页 > 解决方案 > 可选的正则表达式组件

问题描述

我正在使用正则表达式函数返回四个或 5 个新字段:商店名称、详细信息、原因(可选)、暂停时间开始和暂停时间结束。原因并不像其他四个字段那样在所有情况下都出现。如果它确实出现了,那么它就在文本本身内的 Store 和 Details 之间。

我目前正在使用此代码查找四个必填字段(有效):

parser = re.compile(r"your store, ([^,]+).*Details: ([^\n]*).*Created at: ([^\n]*).*Scheduled end time: ([^\n]*)", flags=re.DOTALL | re.MULTILINE)

df1['STORE']=''
df1['DETAILS']=''
df1['TIME_PAUSE_CREATED']=''
df1['TIME_PAUSE_END']=''

for index,i in enumerate(df1.DESCRIPTION):
    txt = parser_reg.findall(i)
    for field in txt:
        df1['STORE'][index]=field[0]
        df1['DETAILS'][index]=field[1]
        df1['TIME_PAUSE_CREATED'][index]=field[2]
        df1['TIME_PAUSE_END'][index]=field[3]

有没有办法制作一个可选的正则表达式字段并附加它(否则附加'Null')并继续抓取其他字段?我尝试过使用以下内容,但这仅在商店名称之后返回空值:

parser = re.compile(r"your store, ([^,]+).*(Reason: ([^\n]*))?.*|Details: ([^\n]*).*)Created at: ([^\n]*).*Scheduled end time: ([^\n]*)", flags=re.DOTALL | re.MULTILINE)

理想情况下,我可以像其他字段一样为“原因”添加相同的列,但正则表达式仍然不适合我。

谢谢!

标签: pythonregex

解决方案


我从你的例子中得到原因:并不总是提供?没关系,只需将其添加为可选(一次或零次)组。如果它不存在,则该捕获组将为空。在 Store 和 Details 之间添加(?:Reason: (.*?))?. 最后一个问号表示整个原因:部分可以出现零次或一次,使其成为可选的。整个正则表达式(经过一些额外的清理)应该是:

your store, ([^,]+).*?(?:Reason: (.*?))?\sDetails: (.*?)(?:\sDeactivation Time)?\sCreated at: (.*?[AP]M).*Scheduled end time: (.*?[AP]M)

请记住,原因:现在将在field[1]其中,其他捕获组将向下移动一个。

我在 Regex101 网站上包含了这个正则表达式扫描您上面的示例字符串。 在此处输入图像描述


推荐阅读