Solución:
match
comienza a buscar desde el principio del texto.
Usar search
en lugar de:
#!/usr/bin/env python
import re
text="Hello, "find.me-_/\" please help with python regex"
pattern = r'"([A-Za-z0-9_./\-]*)"'
m = re.search(pattern, text)
print m.group()
match
y search
regreso None
cuando no coinciden.
Supongo que estas consiguiendo AttributeError: 'NoneType' object has no attribute 'group'
de python: esto se debe a que está asumiendo que coincidirá sin verificar el retorno de re.match
.
Si tú escribes:
m = re.search(pattern, text)
fósforo: busca al principio del texto
buscar: busca toda la cadena
Quizás esto te ayude a entender: http://docs.python.org/library/re.html#matching-vs-searching
En lugar de una expresión regular, podrías
def text_between_quotes(text):
between_quotes = text.split('"')[1::2]
# if you have an odd number of quotes (ie. the quotes are unbalanced),
# discard the last element
if len(between_quotes) % 2 == 0 and not text.endswith('"'):
return between_quotes[:-1]
return between_quotes
Divida el texto entre comillas y todos los índices impares estarán entre dos comillas.
my_string = 'Hello, "find.me-_/\" please help and "this quote" here'
my_string.split('"')
my_string.split('"')[1::2] # ['find.me-_/\', 'this quote']
pero aún debe asegurarse de no tener comillas desequilibradas (digamos que su texto contiene 3 "
‘s), por lo que si tiene un número par de cosas después de hacer el split
, debe descartar el último elemento, que es lo que if
declaración está haciendo.
Esto supone que no tiene comillas entre comillas y que su texto no mezcla comillas ni utiliza comillas elegantes.