2017-09-25 6 views
1

Ich extrahiere die Follower-Nummern aus einer Zeichenfolge wie der folgenden. Das erste Muster scheint nicht auf einzelne Ziffern zu wirken. Liegt es daran, dass das erste Muster prüft, ob hinter der Ziffer ein Zeichen steht und die erste Zeile keine anderen Zeichen zwischen 4 und Followers hat? Das zweite Muster funktioniert gut.Regex-Muster zum Extrahieren von Follower-Zählern

import re 

text = """ 
4 Followers 
330 Followers 
23.5k Followers 
67k Followers 
25m Followers 
""" 
print(re.compile(r'(\d.+) Followers').findall(text)) 
print(re.compile(r'(\d+|\d.+) Followers').findall(text)) 
+1

Sie sollten wirklich einfach https://regex101.com/ verwenden – Idos

+0

Teilen Sie einfach den Raum und das erste Array .. – StefansArya

+0

@Idos Das, was ich benutzt habe. Einfach neu zu regexen und zu versuchen, das Muster zu verstehen, das ich mir besser ausgedacht habe. –

Antwort

1

Das \d.+ Muster entspricht eine Ziffer und dann 1 oder mehr Zeichen außer Zeilenumbruch Zeichen.

Es scheint, dass Sie eine Ziffer und dann alles andere als Whitespace bis zu einem Leerzeichen mit Followers übereinstimmen möchten.

Verwenden

text = """ 
4 Followers 
330 Followers 
23.5k Followers 
67k Followers 
25m Followers 
""" 
print(re.findall(r'\b(\d\S*) Followers', text)) 
# => ['4', '330', '23.5k', '67k', '25m'] 

Siehe regex und Python demo.

Einzelheiten

  • \b - eine Wortgrenze
  • (\d\S*) - Gruppe 1: eine Ziffer, und dann 0+ Nicht-Leerzeichen Symbole
  • Followers - eine wörtliche String.

Wenn Sie Ihre Eingabe gut formatiert ist, können Sie spalten auch die Saiten:

[x.split()[0] for x in text.split('\n')] 

Siehe Python demo (Ausgabe: ['4', '330', '23.5k', '67k', '25m']).

+1

Ich werde mit dem Muster gehen, wie der 'Text' String wurde nur als Dummy verwendet, das Muster wird verwendet, um die Follower-Anzahl von einer gekratzten Website zu extrahieren, Regex nur so viel schneller als bs4. Solide Antwort, danke! –

1

Ich glaube, Ihre Frage ist, warum die verschiedene Ergebnisse mit den zwei Mustern ...

Es ist nicht, dass das erste Muster nicht einstelligen Bereich übereinstimmt, ist es, dass
das erste Muster erwartet eine Ziffer gefolgt um 2 Zeichen vor Followers.

Ich sehe keine Leerzeichen Modifikator im Zusammenhang mit dem regex ignorieren,
so die Regex ist wirklich

        (\d.+)[ ]Followers 
            ^^
      where this ----------------| | 
      expects at least 1 char,  | 
      and this ----------------------| 
      expects 1 more 
      =================================== 
      total is minimum 2 chars between digit and Followers 

Der Grund für die Sekunden Regex funktioniert, ist es erwartet, nur 1 Zeichen
zwischen der Ziffer und Follower

     (\d+|\d.+)[ ]Followers 
         ^ ^
       digit ----|  | 
       1 char-------------|