Python 使用正则表达式从字符串中提取子字符串

Python 使用正则表达式从字符串中提取子字符串,python,regex,shell,extract,Python,Regex,Shell,Extract,我有一个要求,我需要使用正则表达式从字符串中提取子字符串 例如,以下是我的示例数据: Hello, "How" are "you" What "are" you "doing?" 从这个示例数据中,我只需要提取第二次和第四次出现的双引号数据 我的要求是:你在做什么? 我尝试使用下面的正则表达式,但无法按照我的要求提取 "(.*?)" 我们可以使用re.findall然后对结果进行切片以获得第一个和第三个匹配: import re string = 'Hello, "How" are "yo

我有一个要求,我需要使用正则表达式从字符串中提取子字符串

例如,以下是我的示例数据:

Hello, "How" are "you" What "are" you "doing?"
从这个示例数据中,我只需要提取第二次和第四次出现的双引号数据

我的要求是:
你在做什么?

我尝试使用下面的正则表达式,但无法按照我的要求提取

"(.*?)"

我们可以使用
re.findall
然后对结果进行切片以获得第一个和第三个匹配:

import re

string = 'Hello, "How" are "you" What "are" you "doing?"'
result = re.findall('".+?"', string)[1::2]

print(result)
在这里,正则表达式匹配包含在双引号内的任意数量的字符,但尝试尽可能少地匹配(非贪婪匹配),否则我们将得到一个匹配,
“How”是“you”是“What”是“you”在做什么?”

输出:

['"you"', '"doing?"']
you doing?
['you', 'doing?']
如果要在不带引号的情况下组合它们,可以使用
str.strip
str.join

print(' '.join(string.strip('"') for string in result))
输出:

['"you"', '"doing?"']
you doing?
['you', 'doing?']
另一种方法是在
上拆分“

输出:

['"you"', '"doing?"']
you doing?
['you', 'doing?']
这是因为,如果用双引号分隔字符串,则输出如下:

  • 第一个双引号之前的所有内容
  • 第一个双引号之后和第二个双引号之前的所有内容
  • 第二个双引号之后和第三个双引号之前的所有内容

  • 这意味着我们可以使用每个偶数元素来获取引号中的元素。然后,我们可以再次切片结果以获得第二个和第四个结果。

    我们可以尝试使用
    re.findall
    提取所有引用的术语。然后,仅使用结果列表中的偶数项构建字符串:

    input = "Hello, \"How\" are \"you\" What \"are\" you \"doing?\""
    matches = re.findall(r'\"([^"]+)\"', input)
    matches = matches[1::2]
    output = " ".join(matches)
    print(output)
    
    you doing?
    

    仅限正则表达式的解决方案。可能不是100%准确,因为它匹配每一次出现,而不仅仅是第二次和第四次出现,但它适用于示例

    "[^"]+"[^"]+("[^"]+")
    
    JS演示:

    var str='Hello,“你好”,“你”在干什么?”;
    var regex=/“[^”]+“[^”]+(“[^”]+”)/g
    match=regex.exec(str);
    while(匹配!=null){
    //匹配文本:匹配[0]
    //匹配开始:match.index
    //捕获组n:匹配[n]
    console.log(匹配[1])
    match=regex.exec(str);
    
    }
    谢谢您的快速回复@gmds,您对regex有什么想法吗?实际上我需要在nifi中使用这个processor@user6325753什么意思?它确实使用正则表达式。我的意思是,不使用re是否可能?“[^”]+“[^”]+(“[^”]+”)@user6325753我编辑了我的答案以包含一个非正则表达式结果。它最多提取两个双引号字符串,我的要求是只提取第2次和第4次出现。我不确定这是什么意思。它匹配每2个引号字符串。是的,如果只有两个,它将匹配一个,如果有超过五个,它将匹配三个或更多。因为您的question实际上没有给出任何其他要求,除了您展示的示例,它确实解决了这个问题。也许您需要更具体一些此正则表达式不提取第二个带引号的字符串,最多提取第二个带引号的字符串。我只需要第二个和第四个双引号的字符串。我想您可能混淆了术语
    匹配
    ,或者可能不使用全局标志。请参阅我刚才添加的演示。