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实际上没有给出任何其他要求,除了您展示的示例,它确实解决了这个问题。也许您需要更具体一些此正则表达式不提取第二个带引号的字符串,最多提取第二个带引号的字符串。我只需要第二个和第四个双引号的字符串。我想您可能混淆了术语匹配
和组
,或者可能不使用全局标志。请参阅我刚才添加的演示。