正则表达式匹配单词,如果可选地后跟任何单词,除非后跟某些单词
Regex match word if optionally followed by any word unless followed by certain words
我正在尝试匹配以下案例,案例 6 和案例 8 除外:
case 1 - deliverto should match
case 2 - deliveryto : should match
case 3 - deliveryto: should match
case 4 - delivery to : should match
case 5 - delivery address : should match
case 6 - delivery order : should NOT match
case 7 - ship to: should match
case 8 - delivery inst : should NOT match
case 9 - delivery should match
case 10 - remit to : should match
case 11 - send to: should match
case 12 - remitto: should match
case 13 - delivery: should match
case 14 - deliver: should match
case 15 - delv. : should match
我的逻辑是:匹配第一个块[ship
或send
或remit
或deliver
或delivery
或delv.
(点是可选的)] 如果在之后找到第二个块 [to
或 address
] 或什至找不到第二个块但不要使用第一个块 [ship
或 ...]如果在第一个块之后找到第三个块 [order
或 inst
]。
我对第 3 个块使用了负面展望,然后对第 2 个块使用了可选的正面展望。这是我一直在尝试的正则表达式:
pattern = r"(send|remit|ship|delivery|deliver|delv\.?)\s?(?!(Order|inst))(?=(to|address)?)\:?"
我面临的第一个问题是:即使第一个块后面跟着第三个块,正则表达式也会匹配。
第二个问题是:如果可能的情况在列表中并且我尝试对它们进行 re.finditer()
,则不匹配可选的第二个块:
l = ['case 1 - deliverto', 'case 2 - deliveryto :', 'case 3 - deliveryto: ', 'case 4 - delivery to :', 'case 5 - delivery address :', 'case 6 - delivery order :', 'case 7 - ship to:', 'case 8 - delivery inst :', 'case 9 - delivery ', 'case 10 - remit to :', 'case 11 - send to:', 'case 12 - remitto:', 'case 13 - delivery: ', 'case 14 - deliver: ', 'case 15 - delv. :']
for i in l:
print([i.group() for i in re.finditer(patern, i, re.IGNORECASE)])
给出:
['deliver']
['delivery']
['delivery']
['delivery ']
['delivery ']
['delivery']
['ship ']
['delivery']
['delivery ']
['remit ']
['send ']
['remit']
['delivery:']
['deliver:']
['delv. :']
如果找到,我需要匹配可选的 to
或 address
块。我在正则表达式中做错了什么?
有关实现的详细信息,请查看此 regex101 站点。谢谢。
您需要在找到第一个单词后使正则表达式匹配失败:
(?i)\b(?!\S+\s+(?:order|inst))(?:send|remit|ship|delivery?|delv\.?)(?:\s*(?:to|address))?\s?:?
详情:
(?i)
- 启用不区分大小写的匹配(与 re.I
相同)
\b
- 单词边界
(?!\S+\s+(?:order|inst))
- 如果 1+ 个非空白字符、1+ 个空白字符然后 order
或 inst
立即出现在右侧 ,则匹配失败
(?:send|remit|ship|delivery?|delv\.?)
- send
、remit
、ship
、deliver
或交付,
delvor
delv。`
(?:\s*(?:to|address))?
- 一个可选的 0+ 空格序列,然后是 to
或 address
\s?
- 一个可选的空格
:?
- 一个可选的冒号。
我正在尝试匹配以下案例,案例 6 和案例 8 除外:
case 1 - deliverto should match
case 2 - deliveryto : should match
case 3 - deliveryto: should match
case 4 - delivery to : should match
case 5 - delivery address : should match
case 6 - delivery order : should NOT match
case 7 - ship to: should match
case 8 - delivery inst : should NOT match
case 9 - delivery should match
case 10 - remit to : should match
case 11 - send to: should match
case 12 - remitto: should match
case 13 - delivery: should match
case 14 - deliver: should match
case 15 - delv. : should match
我的逻辑是:匹配第一个块[ship
或send
或remit
或deliver
或delivery
或delv.
(点是可选的)] 如果在之后找到第二个块 [to
或 address
] 或什至找不到第二个块但不要使用第一个块 [ship
或 ...]如果在第一个块之后找到第三个块 [order
或 inst
]。
我对第 3 个块使用了负面展望,然后对第 2 个块使用了可选的正面展望。这是我一直在尝试的正则表达式:
pattern = r"(send|remit|ship|delivery|deliver|delv\.?)\s?(?!(Order|inst))(?=(to|address)?)\:?"
我面临的第一个问题是:即使第一个块后面跟着第三个块,正则表达式也会匹配。
第二个问题是:如果可能的情况在列表中并且我尝试对它们进行 re.finditer()
,则不匹配可选的第二个块:
l = ['case 1 - deliverto', 'case 2 - deliveryto :', 'case 3 - deliveryto: ', 'case 4 - delivery to :', 'case 5 - delivery address :', 'case 6 - delivery order :', 'case 7 - ship to:', 'case 8 - delivery inst :', 'case 9 - delivery ', 'case 10 - remit to :', 'case 11 - send to:', 'case 12 - remitto:', 'case 13 - delivery: ', 'case 14 - deliver: ', 'case 15 - delv. :']
for i in l:
print([i.group() for i in re.finditer(patern, i, re.IGNORECASE)])
给出:
['deliver']
['delivery']
['delivery']
['delivery ']
['delivery ']
['delivery']
['ship ']
['delivery']
['delivery ']
['remit ']
['send ']
['remit']
['delivery:']
['deliver:']
['delv. :']
如果找到,我需要匹配可选的 to
或 address
块。我在正则表达式中做错了什么?
有关实现的详细信息,请查看此 regex101 站点。谢谢。
您需要在找到第一个单词后使正则表达式匹配失败:
(?i)\b(?!\S+\s+(?:order|inst))(?:send|remit|ship|delivery?|delv\.?)(?:\s*(?:to|address))?\s?:?
详情:
(?i)
- 启用不区分大小写的匹配(与re.I
相同)\b
- 单词边界(?!\S+\s+(?:order|inst))
- 如果 1+ 个非空白字符、1+ 个空白字符然后order
或inst
立即出现在右侧 ,则匹配失败
(?:send|remit|ship|delivery?|delv\.?)
-send
、remit
、ship
、deliver
或交付,
delvor
delv。`(?:\s*(?:to|address))?
- 一个可选的 0+ 空格序列,然后是to
或address
\s?
- 一个可选的空格:?
- 一个可选的冒号。