簡體   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