2010-01-28 4 views
3

J'essaye de faire une simple division de regex en Python. La chaîne est sous la forme de FooX où Foo est une chaîne et X est un entier arbitraire. J'ai le sentiment que cela devrait être très simple, mais je ne peux pas vraiment le faire fonctionner. Sur cette note, quelqu'un peut-il recommander de bons matériaux de lecture Regex?Python regex split, entier de longueur arbitraire

+0

Comment voulez-vous la scission d'être? Devrait-il retourner seulement Foo? seulement le nombre? tous les deux? – MAK

Répondre

0

En supposant que vous souhaitez partager entre le « Foo » et le numéro, vous voulez quelque chose comme:

r/(?<=\D)(?=\d)/ 

qui correspondra à un point entre un et un chiffre non numérique, sans consommer de caractères la scission.

+1

Bonne idée, mais ne fonctionnera pas, au moins en Python. Il ignore les points de vue dans les expressions rationnelles qui ne correspondent à aucun caractère. –

+0

... sérieusement? Je me demande quelle est la justification de ce comportement. –

+0

@Max S. voir mon edit ... il semble avoir une certaine viabilité en python après tout .. –

1

groupes Utilisation:

import re 

m=re.match('^(?P<first>[A-Za-z]+)(?P<second>[0-9]+)$',"Foo9") 
print m.group('first') 
print m.group('second') 

Utilisation de la recherche:

import re 

s='Foo9' 
m=re.search('(?<=\D)(?=\d)',s) 
first=s[:m.start()] 
second=s[m.end():] 

print first, second 
5

Vous ne pouvez pas utiliser split() depuis que doit consommer certains caractères, mais vous pouvez utiliser la correspondance normale pour le faire.

>>> import re 
>>> r = re.compile(r'(\D+)(\d+)') 
>>> r.match('abc444').groups() 
('abc', '444') 
0
>>> import re 
>>> s="gnibbler1234" 
>>> re.findall(r'(\D+)(\d+)',s)[0] 
('gnibbler', '1234') 

Dans le regex, \ D signifie tout ce qui est pas un chiffre, alors \ D + correspond à une ou plusieurs choses qui ne sont pas des chiffres.

De même \ d signifie tout ce qui est un chiffre, alors \ d + correspond à un ou plusieurs chiffres

1

simple: Garder

>>> import re 
>>> a = "Foo1String12345" 
>>> re.split(r'(\d+)$', a)[0:2] 
['Foo1String', '12345'] 
+0

simple ... et permettant des chiffres dans la "chaîne arbitraire" :-p – MikeyB