Python utilise intelligemment les expressions régulières pour obtenir des chaînes

高洛峰
Libérer: 2017-03-11 10:43:11
original
1624 Les gens l'ont consulté

Je pense que vous rencontrez souvent le besoin d'extraire des chaînes à des positions spécifiques dans le texte dans votre travail quotidien. Python a une très bonne régularité et est très approprié pour extraire de telles chaînes, cet article vous l'expliquera donc en détail. les techniques d'extraction sont expliquées à travers un exemple de code, ce qui est très utile pour que tout le monde puisse comprendre. Les amis dans le besoin peuvent venir apprendre ensemble.

Préface

Je n'entrerai pas dans les connaissances de base des expressions régulières Si vous êtes intéressé, vous pouvez cliquer ici. Il existe généralement deux situations d'extraction : l'une consiste à extraire des chaînes à une seule position dans le texte et l'autre consiste à extraire des chaînes à plusieurs positions consécutives. L'analyse des journaux rencontrera cette situation et je parlerai des méthodes correspondantes ci-dessous.

1. Extraction de chaîne à une seule position

Dans ce cas, nous pouvons utiliser l'expression régulière (. ?) pour extraire. Par exemple, pour une chaîne "a123b", si l'on veut extraire la valeur 123 entre ab, on peut utiliser findall avec une expression régulière, qui renverra une liste contenant toutes les situations correspondantes.

Le code est le suivant :

import re
str = "a123b"
print re.findall(r"a(.+?)b",str)#
输出['123']
Copier après la connexion

1.1 Correspondance gourmande et non gourmande

Si nous avons une chaîne "a123b456b". Si nous voulons faire correspondre toutes les valeurs entre a et le dernier b au lieu de la valeur entre a et la première occurrence de b, nous pouvons utiliser ? -correspondance gourmande.

Le code est le suivant :

import re
str = "a123b456b"
print re.findall(r"a(.+?)b", str)
#输出['123']#?控制只匹配0或1个,所以只会输出和最近的b之间的匹配情况
print re.findall(r"a(.+)b", str)
#输出['123b456']
print re.findall(r"a(.*)b", str)
#输出['123b456']
Copier après la connexion

1.2 Correspondance multi-lignes

Si vous voulez plus Si les lignes correspondent, vous devez ajouter les indicateurs re.S et re.M. Après avoir ajouté re.S. Correspondra aux caractères de nouvelle ligne, par défaut. Ne correspondra pas aux caractères de nouvelle ligne.

Le code est le suivant :

str = "a23b\na34b"
re.findall(r"a(\d+)b.+a(\d+)b", str)
#输出[]
#因为不能处理str中间有\n换行的情况
re.findall(r"a(\d+)b.+a(\d+)b", str, re.S)
#s输出[('23', '34')]
Copier après la connexion

Après avoir ajouté re.M, la marque ^$ correspondra à chaque ligne. La valeur par défaut. ^ et $ Seule la première ligne sera mise en correspondance.

Le code est le suivant :

str = "a23b\na34b"
re.findall(r"^a(\d+)b", str)
#输出['23']
re.findall(r"^a(\d+)b", str, re.M)
#输出['23', '34']
Copier après la connexion

2. Extraction de chaînes de plusieurs positions consécutives

Dans ce cas, nous pouvons utiliser l'expression régulière (?P<name>…) pour extraire. Par exemple, si nous avons une ligne du journal d'accès du serveur Web : &#39;192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"&#39;, et que nous voulons extraire tout le contenu de cette ligne de journal, nous pouvons écrire plusieurs (?P<name>expr) à extraire, et le nom peut être remplacé par la variable que vous avez nommé pour la chaîne d'emplacement, expr peut être remplacé par l'expression régulière de la position d'extraction.

Le code est le suivant :

import re
line =&#39;192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" 
"Mozilla/5.0"&#39;
reg = re.compile(&#39;^(?P<remote_ip>[^ ]*) (?P<date>[^ ]*) "(?P<request>[^"]*)" 
(?P<status>[^ ]*) (?P<size>[^ ]*) "(?P<referrer>[^"]*)" "(?P<user_agent>[^"]*)"&#39;)
regMatch = reg.match(line)
linebits = regMatch.groupdict()
print linebits
for k, v in linebits.items() :
 print k+": "+v
Copier après la connexion

Le résultat de sortie est :

status: 200
referrer: 
request: GET /api HTTP/1.1
user_agent: Mozilla/5.0
date: 25/Oct/2012:14:46:34size: 44
remote_ip: 192.168.0.1
Copier après la connexion

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal