在Excel VBA中,我试图使用正则表达式方法来匹配字符串。一旦发生匹配,我希望匹配的字符串包括整个字符串,除非在匹配字符串的末尾出现关键字。用不同的方式说明,正则表达式模式如下:
import cv2
import numpy as np
cv2.namedWindow('Result')
img = cv2.imread('qkEuE.png')
v1 = 0
v2 = 0
def doEdges():
edges = cv2.Canny(img,v1,v2)
edges = cv2.cvtColor(edges,cv2.COLOR_GRAY2BGR)
res = np.concatenate((img,edges),axis = 0)
cv2.imshow('Result',res)
def setVal1(val):
global v1
v1 = val
doEdges()
def setVal2(val):
global v2
v2 = val
doEdges()
cv2.createTrackbar('Val1','Result',0,500,setVal1)
cv2.createTrackbar('Val2','Result',0,500,setVal2)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输入的字符串为:
pattern = (CHECKOUT[a-zA-Z_(/ ):]+\w+:\w+\s((AM|PM)|(am|pm))\s\-\s\w+:\w+\s((AM|PM)|(am|pm)))
对于第一个字符串,我希望返回整个字符串,但仅返回以下内容: 退房高级客户服务经理FRONTENDMGR:07:00 AM-08:30 AM
使用第二个字符串,我只希望返回从“ CHECKOUT”到“ 01:00 PM”的字符串的第一部分,并且效果很好。
使用第三个字符串,我只希望返回“ CHECKOUT”到“ 01:00 PM”之间的那一部分。
因此唯一不会发生的是第一个字符串,我希望返回整个字符串,但只有第一个部分匹配。
因此,除非字符串中包含“ DRY GOODS”一词,否则我需要调整模式以包括所有内容;如果是,则仅返回单词“ CHECKOUT”和“ AM”或“ PM”之间的部分。
答案 0 :(得分:1)
您可能会在匹配后断定右侧的内容不包含(?!
的情况下,将模式更新为使用否定的前行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)
匹配AM PM PM pm \s-\s\w+:\w+\s
匹配一系列空格char,-
,:
和单词char (?:[AP]M|[ap]m)
匹配AM PM PM pm (?!.*\bDRY GOODS\b)
断言右边的内容在单词边界之间不包含DRY GOODS。.*
匹配任何char 0次以上答案 1 :(得分:0)
从您的展示和所描述的内容来看,我认为这可以做到:
ThenInclude
这将从您的数据中返回:
\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