2017-06-13 39 views
0

我寫了這個功能,蟒蛇 - 正則表達式 - 需要字符串,如果在它裏面沒有逗號和第二空間

def my_func(s): 
    wordlist = ('unit','room','lot') 
    if if any(re.match(r'^'+ word + r'\b' + r'.*$', s.lower()) for word in wordlist) and any(i.isdigit() for i in s.lower()):: 
     if ',' in s: 
      out = re.findall(r"(.*),", s) #Getting everything before comma 
      return out[0] 
     else: 
      out = re.findall(r"([^\s]*\s[^\s]*)", s) #Getting everything before second space. 
      return out[0] 

我的測試數據和預期輸出

Unity 11 Lane. --> None 
Unit 11 queen street --> Unit 11 
Unit 7, king street --> Unit 7 
Lot 12 --> Lot 12 
Unit street --> None 

我在這裏的邏輯是

  1. 如果字符串中有',',則取第一個逗號。
  2. 如果沒有逗號,則佔用第二個空格
  3. 如果字符串不是以單詞表中的任何內容開始,請不要帶出任何內容。
    1. 帶上所有如果沒有第二個空格或逗號。

其他一切工作正常,如何捕捉地塊12這裏說,如果字符串匹配的詞表,也沒有「」沒有第二空間,然後把它全部

+0

如果你希望你的規則是'取第一個逗號,如果字符串中有',',那麼Lot 12 - > Lot 12'和'Unit street - > None'是互斥的。如果沒有逗號,則佔用第二個空間。 「街道」符合這些條件。這些比賽應該只有數字? – zwer

+0

是的,這就是爲什麼我已經在第一個條件添加了這個 - 任何(i.isdigit()爲我在s.lower()) –

回答

1

你」再這樣過於複雜,這是一個簡單的詞+空格+數字匹配:

import re 

def my_func(s): 
    wordlist = ('unit', 'room', 'lot') 
    result = re.match(r"((?:{})\s+\d+)".format("|".join(wordlist)), s, re.IGNORECASE) 
    if result: 
     return result.group() 

測試一下:

test_data = ["Unity 11 Lane.", 
      "Unit 11 queen street", 
      "Unit 7, king street", 
      "Lot 12", 
      "Unit street"] 

for entry in test_data: 
    print("{} --> {}".format(entry, my_func(entry))) 

其中給出:

Unity 11 Lane. --> None 
Unit 11 queen street --> Unit 11 
Unit 7, king street --> Unit 7 
Lot 12 --> Lot 12 
Unit street --> None 

如果你真的想要一個空格,逗號或停產之前匹配的一切,您可以通過替換正則表達式做到這一點:

result = re.match(r"((?:{})\s+.+?(?=\s|,|$))".format("|".join(wordlist)), s, re.IGNORECASE) 

但這匹配你的不想要的字符串之一,因爲該模式不知道你喜歡and但不喜歡street

Unity 11 Lane. --> None 
Unit 11 queen street --> Unit 11 
Unit 7, king street --> Unit 7 
Lot 12 --> Lot 12 
Unit street --> Unit street 
+0

嗨,謝謝。我之所以選擇逗號和第二空間,是因爲我有更多的場景來處理,比如單元7-12女王大街,單元8和10,國王街。這是否也適用於此? –

+0

不,不,但如果你尋找一個空格,逗號或行結束/字符串,你會匹配'單位街道'以及。 – zwer

+0

是的,我需要區分和處理它們。可能在s.lower()中使用任何(i.isdigit()for i)將它們區分爲不同的路徑並使用不同的正則表達式處理它? –