2016-05-19 2 views
-2

I Text habe, wie unten angegeben, ich versuche, aussagekräftige Informationen aus dem Text zu extrahieren (Die Begriffe mit Großbuchstaben oder Ziffer beginnen)regex Entitäten zu finden (mit einem Kapital oder eine Ziffer beginnen)

The text is : "My name is Sam Helsen or Sam H Helsen son of M Helsen working at 3M technologies as the President of Sales" 

die Informationen, die ich zu extrahieren versuchen in der genannten Liste gegeben:

info = ["My",'Sam Helsen', 'Sam H Helsen', 'M Helsen', '3M', 'President of Sales' 

ich den unten regex verwendet habe, die einen Teil der Informationen aus der obigen Liste zu extrahieren, aber nicht alle.

Regex : re.findall(r'\b[A-Z1-9][\d\w]+(?:[\'\s-]\b[A-Z]\w+)*', sent, re.DOTALL) 
Output: ['Sam Helsen', 'Sam', 'Helsen', 'Helsen', '3M', 'President', 'Sale'] 

Mit am regex suchen, ich verstehe, warum ich nicht in der Lage bin, alle Informationen zu holen, aber wenn ich die Regex ändern ändert es andere Ausgänge.

Jede Hilfe wird geschätzt.

+1

Was ist die Logik dahinter, da ich nicht sehe, 'My' in der Liste? Oder in 'President of Sales' beginnt das Wort' of' mit Kleinbuchstaben? – AKS

+1

Wie bestimmen Sie die Anzahl der Wörter ... z. warum '3M' und warum nicht' 3M technologies'? – rock321987

+2

Sie werden nie eine Regex bekommen, die erkennt, dass "President of Sales" zusammen sein sollte, aber "Helsen oder Sam" sollte nicht. –

Antwort

2

du versuchen können, kommen könnte:

(?<!^|\n|[.!?])[A-Z\d][A-Za-z\d]*(?: (?:of)?[A-Z\d][A-Za-z\d]*)* 

Siehe demo.


Aufteilung:

(?<!      make sure this isn't the first word. Should not be preceded by... 
^     ...nothing 
    |\n     ...or a newline 
    |[.!?])    ...or another sentence 
[A-Z\d][A-Za-z\d]*  match a word if it starts with a capital or a digit 
(?:      continue matching infinitely as long as... 
    (?:of)?    ...the next word is "of" and/or... 
    [A-Z\d][A-Za-z\d]* ...the following word is capitalized 
)* 
+0

Ich denke, dass ist sauberer als meins :) – doart3

+0

@ Rawing, Danke, die Lösung funktioniert. – Sam

2

Lassen Sie sich nicht wirklich das, was Sie zu tun versuchen, aber einen Versuch für meine Antwort geben:

/\s(([0-9]?[A-Z]\w*)+((\sof)?\s?[0-9]?[A-Z]\w*)*)/g 

\s - zwingt die Worte, einen Raum zu haben, bevor so kann es nicht das erste sein, ein

([0-9]?[A-Z]\w*)+ - paßt das erste Wort mit Kapital oder Zahl als erstes Zeichen

(\sof)?\s? - entspricht den Anschluss ‚von‘ wenn ist es eine oder Raum zwischen zwei Kapital Worten

[0-9]?[A-Z]\w*)* - Für jeden anderen Wort, das nach

http://regexr.com/3detv

Verwandte Themen