![](/img/trans.png)
[英]Python Regex: Extract all occurences of a substring within a string
[英]Capture all occurences of substring after specific text regex python
我有一份很長的文檔,其中我感興趣的行以Categories:
開頭。 我想在Categories:
之后找到所有由,
分隔的單詞。 這是一個示例行
Categories : Turbo Prop , Very Light , Light , Mid Size
我想找到Turbo Prop
、 Very Light
、 Light
、 Mid Size
的start index
和end index
我正在使用以下代碼
regex_pattern = r"(?<=Categories : )([A-Za-z ]+(?:,)?)+"
matched_text = regex.search(regex_pattern,doc_tex)
但是matched_text.groups()
只給出Mid Size
。 簡而言之,我想在Categories
之后找到group 1
的所有出現。
分兩步進行。 首先使用:
拆分行,然后使用,
拆分第二部分。
category_string = line.split(':')[1]
categories = category_string.split(',')
看起來評論回答了 OP 的問題,但為了完整起見,我想我會發布他們討論的答案。 看起來 Python 的 re 模塊並沒有存儲重復捕獲組的所有實例; 請參閱問題 7132 。 然而,正則表達式package 添加了額外的方法來處理重復的捕獲組,包括。
因此,將正則表達式 package 與matchedobject.starts
和matchedobject.ends
方法一起使用應該有效。
當您使用PyPi regex 模塊時,您可以獲得每組的所有捕獲,以及它們的開始和結束索引,使用
import regex
text = "Categories : Turbo Prop , Very Light , Light , Mid Size"
regex_pattern = r"Categories\s*:(?:\s*([A-Za-z ]+)\b(?:\s*,)?)+"
m = regex.search(regex_pattern, text)
result = list(zip(m.captures(1),m.starts(1),m.ends(1)))
print(result)
# => [('Turbo Prop', 13, 23), ('Very Light', 26, 36), ('Light', 39, 44), ('Mid Size', 47, 55)]
請參閱Python 演示
PyPi regex
文檔中的更多詳細信息:
匹配 object 有額外的方法返回有關重復捕獲組的所有成功匹配的信息。 這些方法是:
matchobject.captures([group1, ...])
- 返回在一個或多個組中匹配的字符串列表。 與
matchobject.group([group1, ...])
進行比較。matchobject.starts([group])
- 返回起始位置列表。 與
matchobject.start([group])
進行比較。matchobject.ends([group])
- 返回結束位置的列表。 與
matchobject.end([group])
進行比較。matchobject.spans([group])
- 返回跨度列表。 與
matchobject.span([group])
進行比較。
請注意,我不得不稍微修改一下您的正則表達式:
Categories\s*:
- 匹配Categories
,零個或多個空格, :
(?:\s*([A-Za-z ]+)\b(?:\s*,)?)+
- 一次或多次重復
\s*
- 零個或多個空白字符([A-Za-z ]+)
- 一個或多個 ASCII 字母或空格\b
- 單詞邊界(因此,第 1 組值將以字母結尾)(?:\s*,)?
- 零個或多個空白字符和逗號的可選序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.