繁体   English   中英

使用 re.findall() 搜索多个条件的文本 [python3.8]

[英]Using re.findall() to search text for multiple criteria [python3.8]

编辑以转移我正在使用的文本数据类型的注意力,并将注意力转移到实际问题上

进一步编辑以注意:

  1. 关闭通知中的链接问题对我的问题没有任何帮助,事实上,大量的标准和语法进一步混淆了我
  2. 我在这里找到了问题的解决方案,并将在重新打开此问题时将其作为答案分享,以便其他任何有相同问题的人至少有一个起点,如果不是这个问题的解决方案。

情况:

我已经编写了一个程序,它使用请求模块从网站上获取所有文本,假设我对一个可以正常工作的系统使用完全相同的代码,这不是问题。 我正在尝试使用re.findall()按数据出现的顺序获取数据。 在有效的系统中,我使用的线路是

paragraphs = re.findall(r'c1(.*?)c1', str(mytext))

在 c1 代替我的第一组标准的地方,我然后用几行来摆脱我不需要的东西。

我试过的:

我尝试了以下代码片段,但都没有奏效。 遗憾的是,我能够找到的信息并没有解决我的问题。 我们可以整天推理为什么这方面的指南很少,但事实是几个小时的谷歌让我一无所获。

第一次尝试:

我试着简单地让它保持一致

re.findall(r'c1(.*?)c1c2(.*?)c2', str(mytext))

其中 c2 代表我的第二个标准不幸的是这返回[]这对我来说是无用的。

第二次尝试:

我想也许我这样做的方式是错误的,所以我稍微改了一下

re.findall(r'c1(.*?)c1', r'c2(.*?)c2', str(mytext))

re.findall(r'c1(.*?)c1'r'c2(.*?)c2', str(mytext))

re.findall(r'c1(.*?)c1' or 'c2(.*?)c2', str(mytext))

re.findall(r'c1(.*?)c1' or r'c2(.*?)c2', str(mytext))

但就前两个而言,与我最初的尝试相同。 最后两个只得到了c1(.*?)c1 ,这是有用的数据,但它根本不包含c2(.*?)c2 ,更不用说它在文本中出现的顺序了。

第三次尝试:

不要运行此代码,这会使我的笔记本电脑因无限循环而崩溃。 此时我已经做了一些研究并发现了re.search() function

paragraphs = []
ticker = ''
while ticker != 'None':
    ticker = re.search(r'c1(.*?)c1', str(mytext))
    if (ticker == 'None'):
        ticker = re.search(r'c2(.*?)c2', str(mytext))
    if (ticker != 'None'):
        paragraphs.append(ticker)
print(paragraphs)

显然,这是一个愚蠢的想法。 它试图使paragraphs[]具有第一个c1(.*?)c1的无限列表。

问题:

如果有的话,我如何使用re.findall()创建一个列表paragraphs ,将 go 通过mytext中的文本并挑选出符合条件c1(.*?)c1c2(.*?)c2的所有内容并按照它们出现的顺序排列它们?

例如,如果文本是(为清楚起见而添加的空格,将不存在于文件中)

c2 hello c2 c1 world c1 c2 !!! c2

该计划将是

#get the text
#do the re.findall() function and assign to the list paragraphs
print(paragraphs)

并将返回

>>>['hello', 'world', '!!!']

作为

re.findall(r'c1(. ?)c1c2(. ?)c2', str(mytext))

什么都不返回,因为你在这里传递了太多 arguments 尝试在两者之间放置 OR 你会得到你的 output。喜欢

re.findall(r'c1(. ?)c2', mytext) 或 re.findall(r'c2(. ?)c3', mytext)

您可以使用

[x.group(2) for x in re.finditer(r'(c1|c2)(.*?)\1', mytext, flags=re.S)]

请参阅正则表达式演示 或者,要匹配最短的子字符串:

[x.group(2) for x in re.finditer(r'(c1|c2)((?:(?!c1|c2).)*?)\1', mytext, flags=re.S)]

正则表达式匹配

  • (c1|c2) - 组 1: c1c2
  • (.*?) - 第 2 组:尽可能少的任何 0 个或更多字符
  • \1 - 与第 1 组中的值相同。

for x in re.finditer(r'(c1|c2)(.*?)\1', mytext)迭代所有匹配项,并且x.group(2)将仅返回组 2 值。

暂无
暂无

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

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