méthode python pour extraire une chaîne à l'aide d'une expression régulière

高洛峰
Libérer: 2017-03-23 16:36:43
original
2652 Les gens l'ont consulté

Avant-propos
Je ne parlerai pas des connaissances de base des expressions régulières. Si vous êtes intéressé, vous pouvez cliquer ici. Il existe généralement deux cas d'extraction. L'un consiste à extraire des caractères. une seule position dans le texte, l'autre consiste à extraire des chaînes avec 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 on a une chaîne "a123b456b", si on veut faire correspondre a et la dernière Toutes les valeurs entre a b au lieu des valeurs entre a et la première occurrence de b peuvent être utilisées pour contrôler la correspondance gourmande et non gourmande régulière.
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 souhaitez une correspondance multi-lignes, vous devez ajouter le re. Drapeaux 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. Par défaut, ^ et $ ne correspondront qu'à la première ligne.
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îne à plusieurs positions consécutives
Dans ce cas, nous pouvons utiliser

(?P<name>…)
Copier après la connexion

Cette expression régulière à extraire. Par exemple, si nous avons une ligne de journal d'accès au serveur Web :

'192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"'
Copier après la connexion

, et que nous voulons extraire tout le contenu de cette ligne de journal, nous pouvons écrire plusieurs

(?P<name>expr)
Copier après la connexion

à extraire, où nom Vous pouvez le remplacer par la variable que vous avez nommée pour la chaîne de position, et expr peut être remplacé par l'expression régulière pour extraire la position.
Le code est le suivant :

import re
line ='192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" 
"Mozilla/5.0"'
reg = re.compile('^(?P<remote_ip>[^ ]*) (?P<date>[^ ]*) "(?P<request>[^"]*)" 
(?P<status>[^ ]*) (?P<size>[^ ]*) "(?P<referrer>[^"]*)" "(?P<user_agent>[^"]*)"')
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 représente l'intégralité du contenu de cet article. J'espère que le contenu de cet article pourra apporter de l'aide aux études ou au travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. .

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!