2017-07-07 1 views
0

Ich versuche, mit einer Regex kommen, die Interpunktion (!,?, Und.), Gefolgt von einem Leerzeichen übereinstimmt. Ich möchte NICHT Perioden entsprechen, die von Begrüßungen wie „Herr“ vorangestellt werden, „Frau“, etc ...Regex, um die Interpunktion gefolgt von Leerzeichen mit einigen Ausnahmen

den ersten Teil zu tun, ist einfach genug: r"[\?|!|\.] "

Aber ich habe Schwierigkeiten mit der zweiter Teil. Hier ist, was ich bisher: r"(?<=[^(Mr|Ms)])\. "

Die zweite nicht so etwas wie „Radar.“ Überein oder „cup.“ Oder „Webstuhl.“, Was schlecht ist. Ich habe auch Probleme, beide Regexe zu einem einzigen zu kombinieren.

Danke.

Antwort

1

Dies sollte funktionieren:

(?<!(Mr)|(Ms))(?<!(Mrs))[.!?](?=\s|$) 

Hier ist eine Demo:

In [19]: re.search(r'(?<!(Mr)|(Ms))(?<!(Mrs))[.](?=\s|$))', 'Mrs. Jones!').group(0) 
Out[19]: '!' 

Es gibt eine negative Lookbehind für Herrn und Frau, und eine positive Vorschau entweder für einen Raum oder EOL.

Bitte beachten Sie, dass jede separate Anrede unterschiedlicher Länge einen eigenen Lookbehind benötigt.


redigiert werden, wie pro Antrag des OP:

In [78]: re.search(r'((?<!(Mr)|(Ms))(?<!(Mrs))[.])|([!?])(?=\s|$)', 'Mrs! Jones').group(0) 
Out[78]: '!' 
+0

Wie würden Sie dies ändern negiert wird, so dass die Anrede Ausnahmen nur vor der Zeit geschehen? Ich würde immer noch gerne übereinstimmen, wenn eine Anrede vor einem "!" oder "?". Entschuldigung, wenn ich ursprünglich nicht klar war. – deruse

+0

@deruse Okay, gib mir ein paar. Wird bearbeiten. –

+0

@deruse Bearbeitet. Ich hoffe, das hilft. –

1

Hier ist ein funktionierendes ein: https://regex101.com/r/iRNTMY/2

(?<!(Mr|Ms))(?<!(Mrs))[.?!] 

Es negativen Blick hinter verwendet zweimal für die beiden unterschiedlichen Länge Möglichkeiten.

0

Wenn vollständig sein wollen, würden Sie ausschließen müssen Prof, Dr, Miss, Mrs, Ms, Mr usw.

Pythons re Modul nicht für irgendetwas nicht zulassen, dass andere als feste Breite lookbacks; dafür müssen Sie mehrere lookbacks für jede Breite tun:

r'(?<!\bMr|\bDr)(?<!Mrs)(?<!\bProf|\bMiss)([.,;])(?= |\n|\Z)' 

Demo

Oder verwenden Sie die regex module, die erlauben würde, variable Breite Lookback-Behauptungen. Dann können Sie tun:

r'(?<!\bMr|\bMrs|\bDr|\bMiss|\bProf)([.,;])(?= |\n|\z)' 

Demo


Randbemerkung: Alles, was innerhalb einer Zeichenklasse entspricht ein einzelnes Zeichen.Deshalb können Sie unerwartete Ergebnisse mit [^(Mr|Ms)] erhalten, die für die Zeichenklasse einzelnen Zeichen des Satzes Mrs|()

Demo

Verwandte Themen