4 Stimmen

Regex divide mit Großbuchstaben

Ich möchte Zeichenfolgen ersetzen wie 'HDMWhoSomeThing' a 'HDM Who Some Thing' mit Regex.

Ich möchte also Wörter extrahieren, die mit einem Großbuchstaben beginnen oder nur aus Großbuchstaben bestehen. Beachten Sie, dass in der Zeichenfolge 'HDMWho' der letzte Großbuchstabe ist in Wirklichkeit der erste Buchstabe des Wortes Who - und sollte nicht in dem Wort enthalten sein HDM .

Was ist die richtige Regex, um dieses Ziel zu erreichen? Ich habe viele Regex' ausprobiert, die ähnlich sind wie [A-Z][a-z]+ aber ohne Erfolg. Die [A-Z][a-z]+ gibt mir 'Who Some Thing' - ohne 'HDM' natürlich.

Irgendwelche Ideen? Ja, danke, Rukki

2voto

Gumbo Punkte 617646

Versuchen Sie, mit diesem regulären Ausdruck zu teilen:

/(?=[A-Z][a-z])/

Und wenn Ihre Suchmaschine für reguläre Ausdrücke die Aufteilung von leeren Übereinstimmungen nicht unterstützt, versuchen Sie diesen regulären Ausdruck, um Leerzeichen zwischen die Wörter zu setzen:

/([A-Z])(?![A-Z])/

Ersetzen Sie es durch " $1" (Leerzeichen plus Übereinstimmung der ersten Gruppe). Dann können Sie am Leerzeichen trennen.

2voto

makapuf Punkte 1340

One liner :

' '.join(a oder b for a,b in re.findall('([A-Z][a-z]+)|(?:([A-Z]*)(?=[A-Z]))',s))

mit regexp

([A-Z][a-z]+)|(?:([A-Z]*)(?=[A-Z]))

2voto

Greg Bacon Punkte 127209
#! /usr/bin/env python

import re
from collections import deque

pattern = r'([A-Z]{2,}(?=[A-Z]|$)|[A-Z](?=[a-z]|$))'
chunks = deque(re.split(pattern, 'HDMWhoSomeMONKEYThingXYZ'))

result = []
while len(chunks):
  buf = chunks.popleft()
  if len(buf) == 0:
    continue
  if re.match(r'^[A-Z]$', buf) and len(chunks):
    buf += chunks.popleft()
  result.append(buf)

print ' '.join(result)

Ausgabe:

HDM Who Some MONKEY Thing XYZ

Nach Codezeilen zu urteilen, passt diese Aufgabe viel besser zu re.findall :

pattern = r'([A-Z]{2,}(?=[A-Z]|$)|[A-Z][a-z]*)'
print ' '.join(re.findall(pattern, 'HDMWhoSomeMONKEYThingX'))

Ausgabe:

HDM Who Some MONKEY Thing X

1voto

ziya Punkte 6046

Kann '[A-Z]*?[A-Z][a-z]+' sein?

Edita: Das scheint zu funktionieren: [A-Z]{2,}(?![a-z])|[A-Z][a-z]+

import re

def find_stuff(str):
  p = re.compile(r'[A-Z]{2,}(?![a-z])|[A-Z][a-z]+')
  m = p.findall(str)
  result = ''
  for x in m:
    result += x + ' '
  print result

find_stuff('HDMWhoSomeThing')
find_stuff('SomeHDMWhoThing')

Druckt aus:

HDM Wer Irgendetwas

Eine HDM-Wer-Sache

1voto

Johrn Punkte 1332

Worte" sind in diesem Fall also:

  1. Beliebig viele Großbuchstaben - es sei denn, auf den letzten Großbuchstaben folgt ein Kleinbuchstabe.
  2. Ein Großbuchstabe gefolgt von einer beliebigen Anzahl von Kleinbuchstaben.

Versuchen Sie es also:

([A-Z]+(?![a-z])|[A-Z][a-z]*)

Die erste Alternation enthält eine negative Vorausschau (?![a-z]), die die Grenze zwischen einem Wort mit Großbuchstaben und einem Wort mit Anfangsbuchstaben behandelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X