我有一個物品清單,其中還包括物品的型別和重量/尺寸。我正在嘗試提取專案名稱。我嘗試了幾種不同的方法,但最接近的是將每個單詞提取為一個條目。
我使用的正則運算式模式:
pattern_2=re.compile(r'[a-zA-Z] \s')
我得到這個結果:
list=['Milk ','Loaf ','of ','Fresh ','White ','Bread ','Rice ']
我想要的結果是這樣的:
list=['Milk','Loaf of Fresh White Bread']
我嘗試了這里提出的模式,但它匹配整個串列作為一個塊。 匹配多行文本塊的正則運算式
我的清單的一部分:
list=['Milk (regular) (1 gallon)', 'Loaf of Fresh White Bread (1 lb)', 'Rice (white) (1 lb)', 'Eggs (regular) (12)', 'Local Cheese (1 lb)']
串列本身更長,所以我試圖找到一種可以用于整個串列的模式。是否可以撰寫一個與整個串列項匹配的正則運算式模式?
uj5u.com熱心網友回復:
import re
s = re.findall(r'[^()] ', 'Loaf of Fresh White Bread (1 lb)')[0].rstrip()
要將其應用于整個串列,請使用以下代碼。(given_list->result_list)
import re
given_list = ['Milk (regular) (1 gallon)', 'Loaf of Fresh White Bread (1 lb)', 'Rice (white) (1 lb)', 'Eggs (regular) (12)', 'Local Cheese (1 lb)']
result_list = [re.findall(r'[^()] ', x)[0].rstrip() for x in given_list]
print(result_list)
# prints ['Milk', 'Loaf of Fresh White Bread', 'Rice', 'Eggs', 'Local Cheese']
使用正則運算式非常棘手。
我建議您查看 正則運算式 自動機理論以熟悉此工具。
代碼說明:
r' [^()] ' 可以分解為[] 和^()
' [] ' 是一組標記(字母)。
我們在[] 中定義了一些標記集。
' ' 表示迭代至少 1 次。
' [] ' 表示某組標記已被迭代 1 次或多次。
' ^ ' 表示補集。
簡單來說,它的意思是“除了某物之外的所有東西的集合”
這里的“東西”是' ( ',和' ) '。
所以“除了括號之外的所有東西”都被設定了。
并且該集合的迭代次數超過 1 次。
所以在人類語言中,這意味著
"除了 '(' 或 ')' 之外的任何字符的字串,長度為 1 或更多。"
findall方法查找滿足此條件的所有子字串,
并列出它。
[0]回傳它的第一個元素。
rstrip 洗掉尾隨空格,因為我們無法使用正則運算式洗掉它。
由于您只需要此正則運算式搜索的第一個結果,因此 re.search 可以更快地完成這項作業。(它找到第一個匹配并停止)示例:
import re
given_list = ['Milk (regular) (1 gallon)', 'Loaf of Fresh White Bread (1 lb)', 'Rice (white) (1 lb)', 'Eggs (regular) (12)', 'Local Cheese (1 lb)']
result_list = [re.search(r'[^()] ', x).group(0).rstrip() for x in given_list]
print(result_list)
# prints ['Milk', 'Loaf of Fresh White Bread', 'Rice', 'Eggs', 'Local Cheese']
uj5u.com熱心網友回復:
您可以使用
import re
l=['Milk (regular) (1 gallon)', 'Loaf of Fresh White Bread (1 lb)', 'Rice (white) (1 lb)', 'Eggs (regular) (12)', 'Local Cheese (1 lb)']
for s in l:
m = re.search(r'^[a-z] (?:\s [a-z] )*', s, re.I)
if m:
print(m.group())
或者,如果您使用 Python 3.8 :
import re
l=['Milk (regular) (1 gallon)', 'Loaf of Fresh White Bread (1 lb)', 'Rice (white) (1 lb)', 'Eggs (regular) (12)', 'Local Cheese (1 lb)']
print( [m.group() for s in l if (m := re.search(r'^[a-z] (?:\s [a-z] )*', s, re.I))] )
輸出:
Milk
Loaf of Fresh White Bread
Rice
Eggs
Local Cheese
請參閱在線 Python 演示。
在^[a-z] (?:\s [a-z] )*正則運算式匹配一個或多個字母,然后在字串的開頭零只或多個出現一個或多個字母,在不區分大小寫的方式,由于re.I期權。
uj5u.com熱心網友回復:
我設法到了這里,但在元素的開頭/結尾我仍然有空格要洗掉:
import re
pattern_2=re.compile(r'([a-zA-Z\s] \s)')
lst = ['Milk (regular) (1 gallon)', 'Loaf of Fresh White Bread (1 lb)', 'Rice (white) (1 lb)', 'Eggs (regular) (12)', 'Local Cheese (1 lb)']
string = "Milk (regular) (1 gallon), Loaf of Fresh White Bread (1 lb), Rice (white) (1 lb), Eggs (regular) (12), Local Cheese (1 lb)"
# for a string
result_string = pattern_2.findall(string)
print(result_string)
# for a list
result_lst = pattern_2.findall(', '.join(lst))
print(result_lst)
''' OUTPUT
['Milk ', ' Loaf of Fresh White Bread ', ' Rice ', ' Eggs ', ' Local Cheese ']
['Milk ', ' Loaf of Fresh White Bread ', ' Rice ', ' Eggs ', ' Local Cheese ']
'''
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351514.html
上一篇:重命名unix命令中的正則運算式
