簡體   English   中英

如何在兩個字符串之間執行模式匹配?

[英]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

我仍在想辦法用正則表達式解決它。

  1. 從基本字符串和傳入字符串中刪除特殊字符
  2. 匹配GB顏色
  3. 從數字中拆分GB,以實現良好匹配

這些事情我已經弄清楚了。

下面的方法怎么樣。 將每個單詞拆分為單詞,將每個單詞小寫並存儲在集合中。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM