Python >> Tutoriel Python >  >> Python Tag >> RegEx

Python Regex correspond avant le caractère ET ignore l'espace blanc

C'est un peu délicat. Vous commencez d'abord la correspondance à partir d'un caractère non blanc, puis continuez la correspondance lentement mais sûrement jusqu'à la position qui est immédiatement suivie d'un nombre facultatif d'espaces et d'une barre oblique :

\S.*?(?= *\/)

Voir la démo en direct ici

Si la barre oblique peut être le premier caractère non blanc dans la chaîne d'entrée, remplacez \S avec [^\s\/] :

[^\s\/].*?(?= *\/)

Cette expression est ce que vous voudrez peut-être explorer :

^(.*?)(\s+\/.*)$

Ici, nous avons deux groupes de capture où le premier collecte votre sortie souhaitée, et le second est votre modèle indésirable, délimité par des caractères de début et de fin, juste pour être sûr qu'il peut être supprimé si vous le souhaitez :

(.*?)(\s+\/.*)

Test Python

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"^(.*?)(\s+\/.*)$"

test_str = ("123 / some text 123\n"
    "anything else    / some text 123")

subst = "\\1"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Démo JavaScript

const regex = /^(.*?)(\s+\/.*)$/gm;
const str = `123 / some text 123
anything else    / some text 123`;
const subst = `\n$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

RegEx

Si ce n'était pas l'expression souhaitée, vous pouvez modifier/changer vos expressions dans regex101.com.

Circuit RegEx

Vous pouvez également visualiser vos expressions dans jex.im :

Espaces

Pour les espaces avant la sortie souhaitée, nous pouvons simplement ajouter un groupe de capture avec lookbehind négatif :

 ^(\s+)?(.*?)(\s+\/.*)$

Démo JavaScript

const regex = /^(\s+)?(.*?)(\s+\/.*)$/gm;
const str = `      123 / some text 123
             anything else    / some text 123
123 / some text 123
anything else    / some text 123`;
const subst = `$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Démo


Voici une solution possible

Regex

(?<!\/)\S.*\S(?=\s*\/)

Exemple

# import regex # or re

string = ' 123 / some text 123'
test = regex.search(r'(?<!\/)\S.*\S(?=\s*\/)', string)
print(test.group(0))
# prints '123'

string = 'a test / some text 123'
test = regex.search(r'(?<!\/)\S.*\S(?=\s*\/)', string)
print(test.group(0))
# prints 'a test'

Brève explication

  • (?<!\/) dit avant une éventuelle correspondance il ne peut y avoir de / symbole.
  • \S.*\S correspond paresseusement à n'importe quoi (.* ) en s'assurant qu'il ne commence ni ne se termine par un espace blanc (\S )
  • (?=\s*\/) signifie qu'une correspondance possible doit être suivie d'un / symbole ou par des espaces blancs + un / .