[英]How to perform pattern matching between two strings?
我希望有一個可以在兩個字符串之間完全匹配的模式匹配代碼。
x = "Apple iPhone 6(Silver, 16 GB)"
y = "Apple iPhone 6 64 GB GSM Mobile Phone (Silver)"
Approach 1:
tmp_body = " ".join("".join([" " if ch in string.punctuation else ch.lower() for ch in y]).split())
tmp_body_1 = " ".join("".join([" " if ch in string.punctuation else ch.lower() for ch in x]).split())
if tmp_body in tmp_body_1:
print "true"
在我的問題中,x將始終是基本字符串,而y將發生變化
Approach 2:
Fuzzy logic --> But was not getting good results through it
Approach 3:
Using regex which I don't know
我仍在想辦法用正則表達式解決它。
這些事情我已經弄清楚了。
下面的方法怎么樣。 將每個單詞拆分為單詞,將每個單詞小寫並存儲在集合中。 x
必須是y
的子集。 因此對於您的示例,它將失敗,因為16與64不匹配:
x = "Apple iPhone 6(Silver, 16 GB)"
y = "Apple iPhone 6 64 GB GSM Mobile Phone (Silver)"
set_x = set([item.lower() for item in re.findall("([a-zA-Z0-9]+)", x)])
set_y = set([item.lower() for item in re.findall("([a-zA-Z0-9]+)", y)])
print set_x
print set_y
print set_x.issubset(set_y)
得到以下結果:
set(['apple', '16', 'gb', '6', 'silver', 'iphone'])
set(['apple', 'mobile', 'phone', '64', 'gb', '6', 'gsm', 'silver', 'iphone'])
False
如果將64
更改為16
則會得到:
set(['apple', '16', 'gb', '6', 'silver', 'iphone'])
set(['apple', '16', 'mobile', 'phone', 'gb', '6', 'gsm', 'silver', 'iphone'])
True
看來您要在兩個未知字串中做最長的公用子字串。 查找兩個字符串之間的公共子字符串
僅當字符串具有已知模式時,正則表達式才起作用。 您可以使用LCS派生一個可用於測試其他字符串的模式,但我認為這不是您想要的。
如果要從這些字符串中提取容量,型號和其他信息,則可能需要使用多種模式來查找每條信息。 某些信息可能不可用。 您的正則表達式需要進行伸縮才能處理較寬的輸入(在樣本量為2的情況下,很難假設所有變化)。
capacity = re.search(r'(\d+)\s*GB', useragent)
model = re.search(r'Apple iPhone ([A-Za-z0-9]+)', useragent)
除非您閱讀了Python re模塊文檔,否則這些模式對您沒有多大意義。 基本上,對於容量,我要搜索1個或多個數字,然后搜索0個或多個空格,然后搜索GB。 如果找到匹配項,則結果是一個匹配對象,並且可以使用match.group()
獲得容量。 盡管我的模式不適用於“ 6 Plus”,但尋找iPhone版本的故事與此類似。
由於您無法控制這些字符串的生成,因此,如果您打算從現在開始使用此腳本,則該腳本將成為3年后的奴隸,請在新字符串格式可用時更新正則表達式模式。 希望這是一次一次性的數字運算,一旦您回答了問題就可以取消。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.