簡體   English   中英

正則表達式匹配單詞,如果可選后跟任何單詞,除非后跟某些單詞

[英]Regex match word if optionally followed by any word unless followed by certain words

我正在嘗試匹配以下情況,但 case 6 和 case 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

我的邏輯是:比賽第1塊[ shipsendremitdeliverdeliverydelv. (點是可選的)] 如果找到第二個塊 [ toaddress ] 之后找到,或者甚至找不到第二個塊,但如果找到第三個塊 [ orderinst ],則不要取第一個塊 [ ship或 ...]在第一個塊之后。

我對第三個塊使用了負面展望,然后對第二個塊使用了可選的正面展望。 這是我一直在嘗試的正則表達式:

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. :']

如果找到,我需要匹配可選的toaddress塊。 我在正則表達式中做錯了什么?

有關實施的詳細信息,請查看此regex101站點。 謝謝。

找到第一個單詞后,您需要使正則表達式匹配失敗:

(?i)\b(?!\S+\s+(?:order|inst))(?:send|remit|ship|delivery?|delv\.?)(?:\s*(?:to|address))?\s?:?

查看正則表達式演示

詳情

  • (?i) - 不區分大小寫匹配 ON(與re.I相同)
  • \\b - 詞邊界
  • (?!\\S+\\s+(?:order|inst)) - 如果 1+ 個非空白字符,1+ 個空白字符,然后orderinst立即出現在右側,則匹配失敗
  • (?:send|remit|ship|delivery?|delv\\.?) - sendremitshipdeliver或交付, delv or delv.`
  • (?:\\s*(?:to|address))? - 一個可選的 0+ 空格序列,然后是toaddress
  • \\s? - 一個可選的空格
  • :? - 一個可選的冒號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM