RegEx用于匹配除特定单词以外的字符串

时间:2019-05-23 15:23:48

标签: regex excel vba regex-negation regex-lookarounds

在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”之间的部分。

2 个答案:

答案 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次以上

Regex demo

答案 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