2014-12-21 8 views
8

Ich möchte alle mit Ausnahme von - dash zu Räumen, dh \W keine Buchstaben ersetzen:Wie ersetzt man alle W (keine Buchstaben) mit Ausnahme von '-' (Strich) mit regulärem Ausdruck?

  1. black-whiteblack-white
  2. black#white geben wird black white geben

ich regulären Ausdruck sehr gut kennen, aber ich habe keine Ahnung, wie man damit umgeht.

Bedenken Sie, dass ich Unicode verwenden möchte, also [a-zA-Z] ist nicht \w wie nur auf Englisch. Bedenken Sie, dass ich Python-re-Syntax bevorzuge, aber andere Vorschläge lesen kann.

Antwort

11

negierte Zeichenklasse verwenden: (\W entspricht [^\w]; [^-\w] =>\W außer -)

>>> re.sub(r'[^-\w]', ' ', 'black-white') 
'black-white' 
>>> re.sub(r'[^-\w]', ' ', 'black#white') 
'black white' 

Wenn Sie regex Paket verwenden, können Sie nested sets, set operations verwenden:

>>> import regex 
>>> print regex.sub(r'(?V1)[\W--[-]]', ' ', 'black-white') 
black-white 
>>> print regex.sub(r'(?V1)[\W--[-]]', ' ', 'black#white') 
black white 
+0

Sieht einfach und gut, dass ich es jetzt testen. – Chameleon

1

Ich würde Verwenden Sie negative lookahead wie unten,

(?!-)\W die negative Vorschau zu Beginn behauptet, dass der Charakter, den wir jede von der \W (Nicht-Wortzeichen Liste) gehen entsprechen - aber nicht von Bindestrich wäre. Es ist wie eine Art Subtraktion, das heißt \W - character present inside the negative lookahead (dh Bindestrich).

DEMO

+0

können Sie auch dieses '- (* SKIP) (* F) | \ W' https://regex101.com/r/sS1qO8/3 verwenden, aber das Regex-Modul unterstützt dies nicht. –

+0

Nette Idee, besser Worttrennung zu tun. – Chameleon

Verwandte Themen