Je veux supprimer les espaces, les parenthèses et les caractères qui viennent après d'autres mots. Par exemple,

  • bonjour (salut) -> bonjour
  • bonjour (salut) -> bonjour
  • bonjour (salut) bonjour -> bonjour
  • (salut) bonjour bonjour -> (salut) bonjour bonjour
  • (salut) bonjour -> (salut) bonjour

J'ai réussi à supprimer les espaces et les parenthèses, mais je ne peux pas l'arrêter quand c'est au début des mots.

re.sub("\s*\(.+", "", "hello(hi)")      # 'hello'
re.sub("\s*\(.+", "", "(hi)_hello")     # '', NOT desirable
re.sub("\w+\s*\(.+", "", "hello(hi)")   # '', NOT desirable
re.sub("\w+\s*\(.+", "", "(hi)_hello")  # '(hi)_hello'

J'ai également consulté certains documents sur l'anticipation négative, mais je ne peux pas l'obtenir jusqu'à présent.

Toute aide est appréciée.

1
ytu 12 avril 2018 à 12:30

3 réponses

Meilleure réponse

Vous pouvez utiliser une expression régulière avec un lookbehind négatif.

cases = [
    'hello (hi)', 
    'hello(hi)', 
    'hello (hi) bonjour', 
    '(hi) hello bonjour', 
    '(hi)_hello'
]
>>> [re.sub(r'(?<!^)\s*\(.*', '', i) for i in cases]
['hello', 'hello', 'hello', '(hi) hello bonjour', '(hi)_hello']

Détails

(?<!   # negative lookbehind
^      # (do not) match the start of line
)     
\s*    # 0 or more spaces
\(     # literal parenthesis
.*     # match 0 or more characters (greedy) 
1
cs95 12 avril 2018 à 09:41

Je ne sais pas si vous devez utiliser l'expression régulière, mais comme vous utilisez Python, cela pourrait également se faire comme ceci:

lines = ["(hi) hello", "hello (hi)", "hello (hi) hello"]

for line in lines:
    result = line.split("(hi)")
    if(result[0] == ""):
        print(line)
    else:
        print(result[0])
0
cs95 15 avril 2018 à 20:41

Vous avez besoin d'un lookbehind négatif: (?<!^). Le (?<!...) est le lookbehind négatif. Cela signifie que ne correspond pas si vous voyez ... avant le reste du match.

Dans ce cas, vous ne voulez pas faire de correspondance au début du cas, donc votre ... sera ^. C'est à dire.:

re.sub("(?<!^)\s*\(.+", "", "(hi)_hello") # (hi_hello)

Il remplace toujours le texte s'il n'y a que des espaces entre le début de la ligne et les premières parenthèses:

re.sub("(?<!^)\s*\(.+", "", "  (hi)_hello") # ' '
1
Tamas Rev 12 avril 2018 à 09:44