Estoy tratando de escribir una expresión regular de Python para capturar el nombre completo de alguien cuyo apellido es Nakamoto? Puede suponer que el primer nombre que viene antes siempre será una palabra que comience con una letra mayúscula. La expresión regular debe coincidir con lo siguiente:

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

Pero no lo siguiente:

'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)

He usado la siguiente expresión regular: [A-Z][a-z]+\sNakamoto

Sin embargo, esto captura tanto Satoshi Nakamoto como satoshi Nakamoto. Me gustaría entender dónde me estoy equivocando y cómo corregirlo. Aquí está mi código:

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())
-2
user92592 12 may. 2016 a las 00:23

3 respuestas

La mejor respuesta

Su expresión regular realmente funciona bien aquí, pero no coincidirá con el caso "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')

La salida es esta:

"test satoshi Nakamoto test" does not match
"test Satoshi Nakamoto test" matches
"test RoboCop Nakamoto test" matches
"test roboCop Nakamoto test" does not match
0
Dennis Jacobfeuerborn 11 may. 2016 a las 22:30

re.I significa ignorar mayúsculas y minúsculas, por lo que la clase explícita de mayúsculas que usaste coincidirá con mayúsculas y minúsculas de todos modos. No uses re.I. Además, para que coincida con "RoboCop", debe aceptar más de una letra mayúscula en un nombre, por lo que probablemente desee:

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

O similar. Esto también utiliza \b como un detector de límite de palabras para que no coincida a mitad de una cadena como fooBar Nakamoto.

1
ShadowRanger 11 may. 2016 a las 21:40

El que funcionó para mí:

rgx = re.compile(r'^[A-Z]\w+ Nakamoto')

Puede verificar aquí: https://regex101.com/r/lNE320/1

0
BlackPioter 12 jun. 2018 a las 22:46