2
votes

Comment extraire une chaîne de la série Pandas à l'aide de Regex commençant par n'importe quelle lettre majuscule

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.


0 commentaires

4 Réponses :


1
votes

Votre expression régulière doit être " [A-Z]. * ". ^ essaiera de faire correspondre à partir du début de la chaîne.


2 commentaires

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



0
votes

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

Test

# 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.

RegEx

Si cette expression n'était pas souhaitée, elle peut être modifiée ou changée dans regex101.com .

 entrez la description de l'image ici

Circuit RegEx

jex.im visualise les expressions régulières:

entrez la description de l'image ici

Démo

(.+?)([A-Z].+)


2 commentaires

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. :(



1
votes

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.


2 commentaires

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😊



1
votes

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?


0 commentaires