[英]Using re.findall() to search text for multiple criteria [python3.8]
编辑以转移我正在使用的文本数据类型的注意力,并将注意力转移到实际问题上
进一步编辑以注意:
情况:
我已经编写了一个程序,它使用请求模块从网站上获取所有文本,假设我对一个可以正常工作的系统使用完全相同的代码,这不是问题。 我正在尝试使用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(.*?)c1
和c2(.*?)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: c1
或c2
(.*?)
- 第 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.