在Excel中,我试图使用regex方法来匹配字符串。一旦匹配发生,我希望匹配的字符串包含整个字符串,除非在匹配字符串结束后出现一个关键字。regex模式以不同的方式说明如下:
pattern = (CHECKOUT[a-zA-Z_(/ ):]+\w+:\w+\s((AM|PM)|(am|pm))\s\-\s\w+:\w+\s((AM|PM)|(am|pm)))
输入的字符串是:
1. CHECKOUT Senior Guest Services Manager FRONTENDMGR: 07:00 AM - 08:30 AM SGSM_BOOKKEEPING: 08:30 AM - 01:00 PM FRONTENDMGR: 01:00 PM - 04:00 PM
2. CHECKOUT Guest Services Manager BOOKKEEPER: 09:00 AM - 01:00 PM DRY GOODS Receiving Clerk RECEIVE: 04:30 AM - 09:00 AM
3. DRY GOODS Receiving Clerk RECEIVE: 04:30 AM - 09:00 AM CHECKOUT Guest Services Manager BOOKKEEPER: 09:00 AM - 01:00 PM
对于第一个字符串,我希望返回整个字符串,但只返回以下内容:签出高级来宾服务经理FRONTENDMGR: 07:00上午- 08:30
对于第二个字符串,我只希望返回从“签出”到"01:00 PM“的字符串的第一部分,这很好。
使用第三个字符串时,我只希望返回“签出”到"01:00 PM“之间的部分,这将发生。
所以唯一没有发生的是第一个字符串,在这里,我希望返回整个字符串,但只希望第一部分匹配。
因此,我需要调整模式,以包括一切,除非单词“干货”在字符串中,如果是的话,只返回“结账”和"AM“或"PM”之间的部分。
发布于 2019-05-23 16:40:24
从你的表现和你的描述来看,我认为这可能会做到:
\bCHECKOUT.*?(?=\s*DRY GOODS|$)
从你的数据来看:
CHECKOUT Senior Guest Services Manager FRONTENDMGR: 07:00 AM - 08:30 AM SGSM_BOOKKEEPING: 08:30 AM - 01:00 PM FRONTENDMGR: 01:00 PM - 04:00 PM
CHECKOUT Guest Services Manager BOOKKEEPER: 09:00 AM - 01:00 PM
CHECKOUT Guest Services Manager BOOKKEEPER: 09:00 AM - 01:00 PM
我们匹配CHECKOUT
,然后匹配其他所有内容,直到(但不包括) DRY GOODS
。如果我们找不到DRY GOODS
,我们就继续到字符串的末尾。
如果字符串扩展到多行,则可能需要将.*?
替换为[\s\S]*?
如果您的数据是绝对必须在最后匹配AM|PM
的,那么请尝试:
\bCHECKOUT.*(?:AM|PM)(?=.*?DRY GOODS|$)
发布于 2019-05-23 15:58:44
您可能会更新您的模式,以便在匹配之后使用负前瞻性(?!
来断言右边的内容不包含DRY GOOD
。
\bCHECKOUT[a-zA-Z_(/ ):]+\w+:\w+\s(?:[AP]M|[ap]m)\s-\s\w+:\w+\s(?:[AP]M|[ap]m)(?!.*\bDRY GOODS\b).*
解释
\bCHECKOUT
字面上匹配一个单词边界,以防止该单词成为较大单词的一部分。[a-zA-Z_(/ ):]+
匹配1+乘以字符类中列出的任何一个\w+:\w+\s
匹配1+单词字符,然后匹配:
,然后再匹配1+单词字符,然后是空格字符。(?:[AP]M|[ap]m)
匹配上午上午或下午\s-\s\w+:\w+\s
匹配一系列空格字符、-
、:
和word字符。(?:[AP]M|[ap]m)
匹配上午上午或下午(?!.*\bDRY GOODS\b)
断言右边的内容不包含单词边界之间的干货。.*
匹配任何字符0+时间https://stackoverflow.com/questions/56278474
复制相似问题