2017-04-15 185 views
0

我試圖學習如何使用正則表達式,但有一個問題。比方說,我有串正則表達式 - 在字符串中查找大寫字

line = 'Cow Apple think Woof` 

我想看看是否line有一個大寫字母(其中,當然,它確實)開始至少兩個單詞。在Python中,我試圖做以下操作:

import re 
test = re.search(r'(\b[A-Z]([a-z])*\b){2,}',line) 
print(bool(test)) 

但是打印False。如果我不是做

test = re.search(r'(\b[A-Z]([a-z])*\b)',line) 

我發現print(test.group(1))Cowprint(test.group(2))w,第一場比賽的最後一個字母(沒有其他元素test.group)。

任何有關指出這個問題和/或如何更好地解決問題的建議?

回答

1

由於內括號,比賽的最後一個字母在組中。只要放棄這些,你就會好起來的。

>>> t = re.findall('([A-Z][a-z]+)', line) 
>>> t 
['Cow', 'Apple', 'Woof'] 
>>> t = re.findall('([A-Z]([a-z])+)', line) 
>>> t 
[('Cow', 'w'), ('Apple', 'e'), ('Woof', 'f')] 

大寫字的數量當然是len(t)

+0

謝謝你。對,我根本不需要那個括號! – Argon

+1

更多,你在這裏不需要任何括號。 're.findall(r'\ b [A-Z] [a-z] + \ b',line)'是你所需要的。 –

1

我使用findall函數來查找與正則表達式匹配的所有實例。使用len來查看有多少匹配,在這種情況下,它打印出3。您可以檢查長度是否大於2,並返回TrueFalse

import re 

line = 'Cow Apple think Woof' 

test = re.findall(r'(\b[A-Z]([a-z])*\b)',line) 
print(len(test) >= 2) 

如果你想使用正則表達式只,你可以搜索一個大寫的字,然後在兩者之間,另一個大寫單詞某些字符。

test = re.search(r'(\b[A-Z][a-z]*\b)(.*)(\b[A-Z][a-z]*\b)',line) 
print(bool(test)) 
  • (\b[A-Z][a-z]*\b) - 查找大寫字
  • (.*) - 匹配0個或多個字符
  • (\b[A-Z][a-z]*\b) - 查找第二大寫字

此方法並不像,因爲它動態將不適合嘗試匹配3個大寫字母。

+1

@Argon,我添加了一個純正則表達式解決方案,不知道它是否更好 – davidhu2000

相關問題