2016-04-18 9 views
4

eine Datei wie folgt gegeben:Wie erfasst man alle Regex-Gruppen in einem Regex?

# For more information about CC-CEDICT see: 
# http://cc-cedict.org/wiki/ 
A A [A] /(slang) (Tw) to steal/ 
AA制 AA制 [A A zhi4] /to split the bill/to go Dutch/ 
AB制 AB制 [A B zhi4] /to split the bill (where the male counterpart foots the larger portion of the sum)/(theater) a system where two actors take turns in acting the main role, with one actor replacing the other if either is unavailable/ 
A咖 A咖 [A ka1] /class "A"/top grade/ 
A圈兒 A圈儿 [A quan1 r5] /at symbol, @/ 
A片 A片 [A pian4] /adult movie/pornography/ 

ich, dass ein JSON-Objekt aufbauen wollen:

  • Sprunglinien, die mit #
  • Pausen Linien in 4 Teile beginnt
    1. Tradition Zeichen (erstreckt sich vom Start ^ bis zum nächsten Leerzeichen)
    2. vereinfachten Zeichen (Span von dem ersten Raum zu dem zweiten)
    3. Pinyin (Span zwischen den eckigen Klammern [...])
    4. der Glanz Raum zwischen den ersten / bis zum letzten / (man beachte, gibt es Fälle, in denen es innerhalb von Schrägstrichen sein können der Glanz, z /adult movie/pornography/

Ich bin derzeit als solche zu tun:

>>> for line in text.split('\n'): 
...  if line.startswith('#'): continue; 
...  line = line.strip() 
...  simple, _, line = line.partition(' ') 
...  trad, _, line = line.partition(' ') 
...  print simple, trad 
... 
A A 
AA制 AA制 
AB制 AB制 
A咖 A咖 
A圈兒 A圈儿 
A片 A片 

Um die [...], ich zu tun hatte:

>>> import re 
>>> line = "A片 A片 [A pian4] /adult movie/pornography/" 
>>> simple, _, line = line.partition(' ') 
>>> trad, _, line = line.partition(' ') 
>>> re.findall(r'\[.*\]', line)[0].strip('[]') 
'A pian4' 

Und die /.../ zu finden, hatte ich zu tun:

>>> line = "A片 A片 [A pian4] /adult movie/pornography/" 
>>> re.findall(r'\/.*\/$', line)[0].strip('/') 
'adult movie/pornography' 

Wie verwende ich Regex-Gruppen, um alle von ihnen auf einmal zu erfassen, was mehrere Partitionen/Splits/Fundall?

+2

i spät bin party..so werde ich es als Kommentar setzen: - https://regex101.com/r/uO0yS1/1 – rock321987

+1

Danke allen für die tollen Antworten !! – alvas

Antwort

6

Ich konnte die Informationen mithilfe von regulären Ausdrücken statt extrahieren.Auf diese Weise können Sie Blöcke in Gruppen fangen und sie dann behandeln wie gewünscht:

import re 

with open("myfile") as f: 
    data = f.read().split('\n') 
    for line in data: 
     if line.startswith('#'): continue 
     m = re.search(r"^([^ ]*) ([^ ]*) \[([^]]*)\] \/(.*)\/$", line) 
     if m: 
      print(m.groups()) 

Die regulären Ausdruck teilt den String in den folgenden Gruppen:

^([^ ]*) ([^ ]*) \[([^]]*)\] \/(.*)\/$ 
    ^^^^^ ^^^^^  ^^^^^  ^^ 
    1)  2)  3)   4) 

Das heißt:

  1. das erste Wort.

  2. das zweite Wort.

  3. der Text innerhalb [ und ].

  4. der Text von / bis zum / vor dem Ende der Linie.

Es gibt:

('A', 'A', 'A', '(slang) (Tw) to steal') 
('AA制', 'AA制', 'A A zhi4', 'to split the bill/to go Dutch') 
('AB制', 'AB制', 'A B zhi4', 'to split the bill (where the male counterpart foots the larger portion of the sum)/(theater) a system where two actors take turns in acting the main role, with one actor replacing the other if either is unavailable') 
('A咖', 'A咖', 'A ka1', 'class "A"/top grade') 
('A圈兒', 'A圈儿', 'A quan1 r5', 'at symbol, @') 
('A片', 'A片', 'A pian4', 'adult movie/pornography') 
2

Dies könnte helfen:

preg = re.compile(r'^(?<!#)(\w+)\s(\w+)\s(\[.*?\])\s/(.+)/$', 
        re.MULTILINE | re.UNICODE) 

with open('your_file') as f: 
    for line in f: 
     match = preg.match(line) 
     if match: 
      print(match.groups()) 

Werfen Sie einen Blick here für eine detaillierte Erklärung der verwendeten regulären Ausdruck.

3
p = re.compile(ru"(\S+)\s+(\S+)\s+\[([^\]]*)\]\s+/(.*)/$") 
m = p.match(line) 
if m: 
    simple, trad, pinyin, gloss = m.groups() 

Weitere Details finden Sie unter https://docs.python.org/2/howto/regex.html#grouping.

+1

Oder für die Kürze 'einfach, trad, pinyin, glanz = m.groups()' – tripleee

+0

Danke, ich schreibe Python nicht regelmäßig, so bin ich froh, dass meine Antwort überhaupt nützlich war. :) –

1

Ich habe regex nach allen vier Gruppen entsprechen: aber

REGEX DEMO

^(.*)\s(.*)\s(\[.*\])\s(\/.*\/)

Dies davon aus, dass es nur einen Raum zwischen den Gruppen, wenn Sie mehr haben können Sie einfach füge einen Modifikator hinzu. Hier

ist eine Demo, wie dies funktioniert mit Python mit den Linien in der Frage zu finden:

IDEONE DEMO

+0

Ich gehe davon aus, dass es für alle ein gutes Lernen wäre, wenn Downvoters auch relevante Kommentare hinterlassen würden. – AKS