2013-10-29 146 views
1

我是Python的新手,並試圖從Perl學習python。在Perl中,如果我想比較對多個子串一串,我會用以下內容:Python:比較字符串變量和多個子字符串

sub matchCity { 
    my $cityName = shift; 
    print "$cityName is a valid city name\n" if ($cityName =~ /kyo|par|omba/); 
} 

matchCity('tokyo'); # tokyo is a valid city name 
matchCity('paris'); # paris is a valid city name 
matchCity('bombay'); # bombay is a valid city name 
matchCity('chicago'); # Doesn't print anything 

我怎樣才能在Python這樣做呢?

+2

什麼是錯誤的與芝加哥!?! –

回答

2
import re 

def matchCity(city_name): 
    if re.search('kyo|par|omba', city_name): 
     print "{} is a valid city name".format(city_name) 

matchCity('tokyo') # tokyo is a valid city name 
matchCity('paris') # paris is a valid city name 
matchCity('bombay') # bombay is a valid city name 
matchCity('chicago') # Doesn't print anything 
+0

不是所有的人都返回'None'嗎? – SethMMorton

+0

該函數返回'None'。你是這個意思嗎? –

+0

是的。在你添加的評論中,你註釋了當''chicago''被傳遞時,它返回'undef'。我是說a)不應該是'None',並且b)因爲他們都返回'None',所以不能檢查返回值以查看城市是否匹配(因爲我認爲這是它的原因被提及它返回'undef')。 – SethMMorton

3

你實際上並不需要的正則表達式是:

>>> def matchCity(s): 
...  if any(r in s for r in ('kyo','par','omba')): 
...   print s, 'is a valid city name' 
... 
>>> matchCity('tokyo') 
tokyo is a valid city name 
>>> matchCity('paris') 
paris is a valid city name 
>>> matchCity('bombay') 
bombay is a valid city name 
>>> matchCity('chicago') # doesn't print anything 
>>> 
+0

不是所有人都返回'None'嗎? – SethMMorton

+0

@SethMMorton你是對的,我更新了答案。 – arshajii

+0

如果我用一個簡單的語句(我使用'x = 1')來取代打印以獲得有效的時間,這似乎是re法的兩倍(我的機器上1.15 uS vs. 2.01 uS)。 –

0

使用正則表達式:

import re 
city = re.compile('kyo|par|omba', re.I) 
matchCity = lambda x: city.search(x) 

你也可以使用matchCity("example_city")作爲條件:

if matchCity("tokyo"): print "Valid city!" # Valid city! 
if matchCity("paris"): print "Valid city!" # Valid city! 
if matchCity("bombay"): print "Valid city!" # Valid city! 
if matchCity("chicago"): print "Valid city!" # 
0

Python有正則表達式秒。所以你可以做到這一點:

import re 

city_names = re.compile(r'kyo|par|omba') 

def match_city(city_name): 
    if city_names.search(city_name): 
     print city_name, "is a valid city name" 

通常我會告訴你如果可以避免正則表達式。但是,匹配多個子字符串中的一個實際上是一種情況,他們可能比循環執行得更好。隨着子字符串數量的增長,情況尤其如此。

+0

根據對@arshajii的帖子的評論,即使在這種情況下,'re'也比字符串方法慢。 – SethMMorton

+0

但他可能是正確的......我做的測試包括正則表達式的編譯,如果你有更多的子串來檢查,時間優勢可能會改變。稍後會嘗試。 –