[英]Regex to match all words inside parenthesis
想象一下,這是大文本的一部分:
東西(word1 / word2 / w0rd3)東西,東西(word4 / word5)東西/東西(word6)東西(word7 / word8 / word9)東西/東西,(w0rd10 / word11)東西東西(word12)東西(Word13 / w0rd14 / word15)東西東西(word16 / word17)。
我想要的話。 結果必須匹配:
word1
Word2
w0rd3
word4
word5
word6
word7
word8
word9
w0rd10
word11
word12
Word13
w0rd14
word15
word16
word17
結果也不應該像:
(word1) or (word1/Word2/w0rd3)
基本上沒有(或)或/允許
我嘗試過的:
\((\w+)\/(\w+)\/(\w+)\)[^(]*\((\w+)\/(\w+)\)[^(]*\((\w+)\)
這匹配這些單詞,但我必須復制它,因為存在許多不干凈的單詞。 我也嘗試了txt2re,但它也是重復的,它不是一行正則表達式。 如果我想在在線正則表達式評估器上使用它並且沒有編碼訪問,那么我需要一行和短正則表達式。 我首選的引擎是Python和C#。
更新:我在文中添加了一些/
。 也很抱歉更改接受的答案,所有答案都是正確的,但我必須在這里選擇最快,最有效的正則表達式。
常見的解決方案是檢查,如果有一個閉合)
前方無任何開口(
在兩者之間。
\w+\b(?=[^)(]*\))
因此,這種模式不會檢查開口(
之前,但通常不需要)。
您可以使用將由re.findall返回的捕獲組,並使用正斜杠作為分隔符匹配括號之間的所有捕獲組。
然后在結果中你可以拆分正斜杠:
\((\w+(?:/\w+)*)\)
說明
\\(
匹配左括號 (
捕捉小組
\\w+
匹配1+單詞字符 (?:/\\w+)*
匹配0次和/
或1+個字符 )
關閉捕獲組 \\)
匹配右括號 如果要匹配多個單詞字符,可以使用否定字符類[^()/]+
匹配不是括號或正斜杠:
\(([^()/]+(?:/[^()/]+)*)\)
例如:
import re
regex = r"\(([^()/]+(?:/[^()/]+)*)\)"
test_str = "stuff (word1/Word2/w0rd3) stuff, stuff (word4/word5) stuff stuff (word6) stuff (word7/word8/word9) stuff stuff, (w0rd10/word11) stuff stuff (word12) stuff (Word13/w0rd14/word15) stuff-stuff stuff (word16/word17)."
res = list(map(lambda x: x.split('/'), re.findall(regex, test_str)))
或者看看扁平版本 。
您可以編寫與非單詞匹配的正則表達式,而不是匹配單詞,並使用正則表達式進行拆分:
\)?[^)]+?\(|\).+|/
非單詞是:
將findall
與look-behind斷言一起使用
(?<=[(/])\w+
>>> re.findall(r'(?<=[(/])\w+', input_string)
['word1', 'Word2', 'w0rd3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'w0rd10', 'word11', 'word12', 'Word13', 'w0rd14', 'word15', 'word16', 'word17']
釋
(?<=[(/])\\w+
積極的觀察
(?<=[(/])
- 斷言下面的正則表達式匹配
- 匹配列表中的單個字符
[(/]
(
或/
匹配單個字符\\w+
匹配任何單詞字符(等於[a-zA-Z0-9_]
)
+
量詞 - 在一次和無限次之間匹配,盡可能多次,根據需要回饋(貪婪)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.