试图了解Python Regex的

时间:2016-05-11 21:23:08

标签: python regex

我正在尝试编写一个Python正则表达式来捕获姓氏为Nakamoto的人的全名?您可以假设它之前的名字始终是一个以大写字母开头的单词。正则表达式必须符合以下条件:

'Satoshi Nakamoto'
'Alice Nakamoto'
'RoboCop Nakamoto'

但不是以下内容:

'satoshi Nakamoto' (where the first name is not capitalised)
'Mr. Nakamoto' (where the preceding word has a nonletter character)
'Nakamoto' (which has no first name)
'Satoshi nakamoto' (where Nakamoto is not capitalised)

我使用了以下正则表达式:[A-Z][a-z]+\sNakamoto

然而,这会捕获Satoshi Nakamotosatoshi Nakamoto。我想知道我哪里出错了以及如何纠正它。这是我的代码:

import re    #import regular expressions

#regular expression
NameSearch = re.compile(r'[A-Z][a-z]+\sNakamoto', re.I | re.VERBOSE)

# perform search on string
Result = NameSearch.search("Satoshi Nakamoto")

#Debug code to check if it found a match or not
print (Result == None)

if Result != None:
    print (Result.group())

3 个答案:

答案 0 :(得分:1)

re.I表示忽略大小写,因此您使用的显式大写类无论如何都会匹配大小写。不要使用re.I。另外,要匹配" RoboCop",您需要在名称中接受多个大写字母,因此您可能需要:

NameSearch = re.compile(r'\b[A-Z][a-zA-Z]+\sNakamoto\b', re.VERBOSE)

等。这也使用\b作为单词边界检测器,因此您不会在fooBar Nakamoto之类的字符串中途匹配。

答案 1 :(得分:0)

你的正则表达式实际上在这里工作正常,但它与“RoboCop Nakamoto”案例不符。

import re

def printMatch(name):
    pat = re.compile(r'\b[A-Z][a-zA-Z]+\sNakamoto')
    if pat.search(name):
        print '"'+name+'" matches'
    else:
        print '"'+name+'" does not match'

printMatch('test satoshi Nakamoto test')
printMatch('test Satoshi Nakamoto test')
printMatch('test RoboCop Nakamoto test')
printMatch('test roboCop Nakamoto test')

输出是这样的:

"test satoshi Nakamoto test" does not match
"test Satoshi Nakamoto test" matches
"test RoboCop Nakamoto test" matches
"test roboCop Nakamoto test" does not match

答案 2 :(得分:0)

对我有用的那个:

df.ACTION.eq('opened').cumsum()
Out[352]: 
0     1
1     1
2     2
3     2
4     3
5     3
6     4
7     4
8     5
9     5
10    5
11    5
12    6
13    6
14    7
15    8
16    9
17    9
18    9
Name: ACTION, dtype: int32

您可以在此处查看:Nginx Config 2