python - 可选的正则表达式组件
问题描述
我正在使用正则表达式函数返回四个或 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)
理想情况下,我可以像其他字段一样为“原因”添加相同的列,但正则表达式仍然不适合我。
谢谢!
解决方案
我从你的例子中得到原因:并不总是提供?没关系,只需将其添加为可选(一次或零次)组。如果它不存在,则该捕获组将为空。在 Store 和 Details 之间添加(?:Reason: (.*?))?
. 最后一个问号表示整个原因:部分可以出现零次或一次,使其成为可选的。整个正则表达式(经过一些额外的清理)应该是:
your store, ([^,]+).*?(?:Reason: (.*?))?\sDetails: (.*?)(?:\sDeactivation Time)?\sCreated at: (.*?[AP]M).*Scheduled end time: (.*?[AP]M)
请记住,原因:现在将在field[1]
其中,其他捕获组将向下移动一个。
推荐阅读
- python - python 中的运行时错误 - 计算 pyth。定理
- android - 如何在 rxjava 中调用与 interval() 一起使用的 onComplete()
- javascript - 如何设置 Asp.net core 3.1 和 Reactjs 的混合结构
- c# - C# - 并行运行的多个任务可以附加到一个字符串吗?
- video - Xamarin Forms:如何捕获 webview 视频/音频播放时间?
- node.js - MongoDB自定义方法在其他两个数据被批准时更改一个数据
- javascript - 我如何获得机器人频道的频道 ID 和消息作者所在的频道
- security - 什么是木马-QT5?如何查看家庭酿造历史?
- javascript - 如何在Javascript中等待具有不同参数的同一函数的多次调用
- ubuntu - 在 x86-64 上启用分段