繁体   English   中英

python - 匹配除字符串正则表达式之外的所有内容

[英]python - Match Everything except the string regex

数据集

Cider
631

Spruce
871

Honda
18813

Nissan
3292

Pine
10621

Walnut
10301

代码

#!/usr/bin/python
import re

text = "Cider\n631\n\nSpruce\n871Honda\n18813\n\nNissan\n3292\n\nPine\n10621\n\nWalnut\n10301\n\n"

f1 = re.findall(r"(Cider|Pine)\n(.*)",text)

print(f1)

当前结果

[('Cider', '631'), ('Pine', '10621')]

题:

如何更改正则表达式以匹配除几个指定字符串之外的所有内容? 前(本田|日产)

想要的结果

[('Cider', '631'), ('Spruce', '871'), ('Pine', '10621'), ('Walnut', '10301')]

您可以排除匹配名称或仅匹配数字,然后匹配至少以非空白字符开头的 2 行。

^(?!(?:Honda|Nissan|\d+)$)(\S.*)\n(.*)

模式匹配:

  • ^字符串开始
  • (?!负前瞻,断言不是直接向右
    • (?:Honda|Nissan|\\d+)$匹配 at 的任何选项,然后断言字符串的结尾
  • )关闭前瞻
  • (\\S.*)捕获组 1 ,匹配一个非空白字符,然后是该行的其余部分
  • \\n匹配换行符
  • (.*)捕获组 2 ,匹配除换行符以外的任何字符

正则表达式演示

import re

text = ("Cider\n"
            "631\n\n"
            "Spruce\n"
            "871\n\n"
            "Honda\n"
            "18813\n\n"
            "Nissan\n"
            "3292\n\n"
            "Pine\n"
            "10621\n\n"
            "Walnut\n"
            "10301")
f1 = re.findall(r"^(?!(?:Honda|Nissan|\d+)$)(\S.*)\n(.*)", text, re.MULTILINE)

print(f1)

输出

[('Cider', '631'), ('Spruce', '871'), ('Pine', '10621'), ('Walnut', '10301')]

如果该行应以大写字符 AZ 开头并且下一行应仅包含数字:

^(?!Honda|Nissan)([A-Z].*)\n(\d+)$

此模式匹配:

  • ^字符串开始
  • (?!Honda|Nissan)负前瞻,直接向右断言不是本田或日产
  • ([AZ].*)捕获组 1 ,匹配大写字符 AZ 后跟该行的其余部分
  • \\n匹配换行符
  • (\\d+)捕获第 2 组,匹配 1+ 个数字
  • $字符串结尾

正则表达式演示

用插入符号 '^' 符号反转它。

f1 = re.findall(r"(\s?^(Cider|Pine))\n(.*)",text)

请记住,插入符号(在正则表达式中)如果用作第一个字符匹配则具有特殊含义,这意味着“它是否从一行的开头开始”。

这就是为什么人们会在开头插入一个“不可使用的字符”。 我选择了一个可选的单个空格来用完第一个字符,从而将插入符号 (^) 的含义渲染为不是“行的开头”,而是为了获得所需的逆运算符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM