【问题标题】:How to get all the words "bar" after the word "foo" with regex如何使用正则表达式在单词“foo”之后获取所有单词“bar”
【发布时间】:2019-11-27 17:41:21
【问题描述】:

我正在尝试检索单词 foo 之后出现的所有 word 栏。

以下内容:

呵呵

条形

faa

foobar fuu

barfuubar

条形

酒吧fuu

我想检索所有粗体条并忽略第一个斜体格式的条。

我尝试使用以下正则表达式:

(?<=foo)bar

但这只会捕获第一次出现。

更新

感谢大家的支持。 下面的数据更接近现实:

Some data

name: Person 1

Some data

my_delimiter:

 name: Person 2

 Some data

name: Person 3

Some data

 name: Person 4

 Some data

Some data

我想得到 my_delimiter:

之后的人名

我在这里测试https://regex101.com/r/HrCLva/2

【问题讨论】:

  • 您是替换那些匹配项还是只是提取?
  • 按foo分割一次,按bar简单搜索。
  • 好的,所以,您不能在 Python re 中使用像 (?&lt;=foo.*?) 这样的无限宽度后视,因此只需在第一个 foo 之后获取一个子字符串,然后从这部分中提取。以一种非常快速和肮脏的方式:re.findall(r'bar', text.split('foo', 2)[1])
  • 另外,您可以安装 PyPi 正则表达式模块并使用regex.findall(r'(?s)(?&lt;=foo.*?)bar', text),参见rextester.com/ZSII13536
  • 参见regex101.com/r/HrCLva/3,与 PyPi 正则表达式一起使用

标签: python regex regex-lookarounds


【解决方案1】:

更新答案后,您不需要正则表达式后视,您可以使用这样的正则表达式来查找分隔符后的名字:

my_delimiter:\s+name:\s*(.*)

Working demo

另一方面,如果您希望所有名称都在分隔符之后,那么您可以使用这样的正则表达式技巧,然后从捕获组中获取内容:

[\s\S]*my_delimiter|name:\s*(.*)$

Working demo 2

捕获组存储以绿色突出显示的数据。

【讨论】:

  • 此解决方案有效,但由于“|”算子,时间成本太高,导致应用于大文本时出现一些超时。
  • @JulianoPacheco,是的......这个正则表达式很昂贵,但您的用例对于正则表达式来说也是一个“复杂”的场景。您可以尝试使用这种替代方案[\s\S]*my_delimiter|name:\s*([^\n]+)$ 并检查它是否可以提高性能
【解决方案2】:

两件事,取决于你究竟追求什么:

  1. 如果你在一行之后所有的出现,那么你需要使用re.findall

    exp = re.compile("foo(?:.*?((bar)+)*)") # See https://regex101.com/r/zzBFFb/1
    match = exp.findall(mystring)
    
  2. 如果您毕竟在多行上都出现了上述情况,那么您需要添加一些标志来告诉它不要以不同的方式处理换行符:

    exp = re.compile("foo(?:.*?((bar)+)*)", re.DOTALL | re.MULTILINE) 
    match = exp.findall(mystring)
    

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    相关资源
    最近更新 更多