正则表达式:在匹配中匹配

时间:2017-07-15 11:16:40

标签: python regex python-2.7

我正在尝试使用正则表达式来查找包含特定单词的两个单词之间的所有内容,但是这些单词会重复,所以我没有得到我想要的匹配。

例如,我想要'hello'和'bye'之间的所有内容,以便在它们之间存在“apple”这个词:

+------+----+------+
| RowN | Id | Name |
+------+----+------+
|    1 |  1 | ABC  |
|    2 |  4 | JHF  |
|    3 |  3 | LMN  |
|    4 |  2 | XYZ  |
+------+----+------+

我想要的结果是“sometext apple sometext”,即文本的最小量,以满足条件。

但是,如果我使用hello sometext hello sometext apple sometext bye sometext bye ,我会得到:

hello((?s).*apple(?s).*)bye

2 个答案:

答案 0 :(得分:4)

要使用server { listen 80; server_name APP_PRIVATE_IP_ADDRESS; location / { proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } 之前的最后一个之前的所有hello, 将apple放在模式前面:

.*

另外,我不确定r'.*hello (.*?apple.*?) bye' 的含义。 在任何情况下,上面的模式都会给出你想要的结果, 例如,当用作(?s)时。

最后, 正如@Rawing在评论中指出的那样:

  

[...]此正则表达式将为您提供 last 次。例如,如果输入字符串为re.match(r'.*hello (.*?apple.*?) bye', s).group(1),则您将获得hello apple1 bye hello apple2 bye。因此,如果您需要查找多个匹配项,则此正则表达式无法正常工作。

...当@bobble-bubble对此做出回应时,您可以通过使用这样的前瞻来找到第一次出现:

apple2

答案 1 :(得分:0)

投入几个单词边界,这将匹配它。

(?s)\bhello\b(?:(?!\b(?:hello|bye)\b).)*\bapple\b.*?\bbye\b

解释

 (?s)                 # Modifier: dot-all
 \b hello \b          # 'hello
 (?:
      (?!
           \b 
           (?: hello | bye )    # Not 'hello' nor 'bye'
           \b 
      )
      . 
 )*
 \b apple \b          # 'apple'
 .*?                  # the rest (note - this could match hello again)
 \b bye \b            # 'bye'