Je veux extraire une série de chaînes dans une nouvelle série qui ne contient que des chaînes commençant par une lettre majuscule des données de la série d'origine.
J'ai déjà essayé d'utiliser regex dans une série de pandas et cela fonctionnait bien donc je l'utilise comme référence. Le code ci-dessous est celui que j'ai utilisé dans mon numéro actuel.
0 HC31A20 1 HC30A20 2 HC42A20 3 HC5H20 4 HC4M20
Le code ci-dessous est ce que j'utilise actuellement pour extraire les chaînes commençant par une lettre majuscule
In [63]:
batch1['Wire Name'].head()
Out[63]:
0 2HC31A20
1 HC30A20
2 2HC42A20
3 2HC5H20
4 HC4M20
In [64]:
batch1['Grouping'] = batch1['Wire Name'].str.extract('^[A-Z].*',expand=True)
batch1['Grouping'].head()
Out [64]:
ValueError: pattern contains no capture groups
Je m'attends à ce que le résultat soit:
harness['new'] = harness['Material'].str.extract('.*\-(.*)\-.*',expand=True)
Selon vous, qu'est-ce qui ne va pas? J'ai vérifié à partir de la page des expressions régulières et des exemples d'utilisation, mais cela ne fonctionnait pas lorsque j'utilise le code ci-dessus.
4 Réponses :
Votre expression régulière doit être " [A-Z]. * ". ^ essaiera de faire correspondre à partir du début de la chaîne.
Cela fonctionne-t-il réellement? Je pense qu'il jette toujours un ValueError .
Cette regex fonctionne en ajoutant des parenthèses entre l'expression régulière. Merci raka
Ici, nous pouvons simplement utiliser un [AZ] comme limite gauche, puis balayer vers la droite et collecter le reste de la chaîne, peut-être similaire à:
const regex = /(.+?)([A-Z].+)/gm;
const str = `0 2HC31A20
1 HC30A20
2 2HC42A20
3 2HC5H20
4 HC4M20
`;
const subst = `$2`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"(.+?)([A-Z].+)"
test_str = ("0 2HC31A20\n"
"1 HC30A20\n"
"2 2HC42A20\n"
"3 2HC5H20\n"
"4 HC4M20\n")
subst = "\\2"
# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
if result:
print (result)
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
Si cette expression n'était pas souhaitée, elle peut être modifiée ou changée dans regex101.com .
jex.im visualise les expressions régulières:
(.+?)([A-Z].+)
Une démo javascript n'est pas particulièrement utile pour une question python. Juste FYI. Il y a une telle chose comme exagéré quand on répond à une question aussi simple ;-)
Je devrais également mentionner qu'il s'agit d'une question pandas, donc votre code python n'est pas utile non plus. :(
Vous pouvez utiliser:
df = pd.DataFrame({'text': ['2HC31A20', 'HC30A20', '2HC42A20','2HC5H20', 'HC4M20']})
df['text'].str.extract(r'(^[A-Z][\w]+)', expand=False)
0 NaN
1 HC30A20
2 NaN
3 NaN
4 HC4M20
Description:
^ [AZ] : Ceci signifie commencer par des lettres majuscules uniquement.
[\ w] + : Cela signifie prendre tous les A-Z, a-z, 0-9, _ après les majuscules.
Que signifie le «r» avant le code regex? Dans mon cas, je veux filtrer 0,2,3 pour ne pas les rendre nuls
Merci heena Je viens de réaliser par ta réponse que je dois ajouter des parenthèses entre le code regex principal et maintenant ça marche😊
Merci, mon code fonctionne en ajoutant des parenthèses entre l'expression régulière principale
In[63]:
batch1['Wire Name'].head()
Out[63]:
0 2HC31A20
1 HC30A20
2 2HC42A20
3 2HC5H20
4 HC4M20
Name: Wire Name, dtype: object
In [147]:
batch1['Grouping'] = batch1['Wire Name'].str.extract('([A-Z].*)',expand=True)
batch1['Grouping'].head()
Out[147]:
0 HC31A20
1 HC30A20
2 HC42A20
3 HC5H20
4 HC4M20
Name: Grouping, dtype: object
Je ne sais pas pourquoi bien que je pensais que les parenthèses sont utilisées pour choisir dans quelle partie de l'expression régulière nous voulons extraire? p>
N'est-ce pas sans parenthèses qu'il en résultera le même résultat?