Maison > Article > développement back-end > Comment extraire des chaînes à l'aide d'expressions régulières en python
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 y a généralement deux situations. pour l'extraction. L'une consiste à extraire les chaînes à une seule position dans le texte, et l'autre consiste à extraire les 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']
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']
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')]
Après avoir ajouté re.M, la marque ^$ correspondra à chaque ligne. ^ 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']
2. Extraction de chaînes de plusieurs positions consécutives
Dans ce cas on peut utiliser l'expression régulière
(?P<name>…)
pour 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"'
, et que nous voulons extraire tout le contenu de cette ligne de journal, nous pouvons écrire plusieurs
(?P<name>expr)
à 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
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
Résumé
Ce qui précède est l'intégralité du contenu de cet article, j'espère que le contenu de cet article. l'article sera utile pour vos études ou votre travail peut vous apporter de l'aide. 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!