[英]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.