Версия Strip() в регулярных выражениях: использование параметра функции непосредственно при компиляции регулярных выражений

#python #regex #python-3.x

#python #регулярное выражение #python-3.x

Вопрос:

Я работаю над практической задачей «Regex Version of Strip()» из Automate the Boring Stuff, глава 7. Я видел использование ' char ' для извлечения параметра функции непосредственно в компиляцию регулярных выражений, но я не понимаю, как работает это форматирование.

 def pseudoStrip(inputString, char='s'):
    stripRegex = re.compile(r'^' char '|' char ' $')
    print(stripRegex.sub('', inputString))
  

' char ' Это то же самое, что [' char '] ?

Есть ли более читаемый или Pythonic способ выполнения этой задачи?

Комментарии:

1. Это просто конкатенация строк; например, если char равно X, результат будет '^X|X $' . Обратите внимание, что r префикс raw здесь совершенно бесполезен, поскольку он применяется только к первому символу. Возможно, было бы понятнее, если бы оно было написано с некоторыми пробелами: '^' char '|' char ' $'

2. не по теме: использование префикса raw может вступить в силу здесь, если вы используете его с f-string: rf'^{char}|{char}$' (хотя в этом конкретном примере это все еще ничего не значит)

3. Спасибо вам обоим за вашу помощь.

Ответ №1:

Добавьте сюда ваше регулярное выражение, и оно расскажет вам, что делает выражение: https://regex101.com/#python

Комментарии:

1. Добро пожаловать в SO, пожалуйста, не добавляйте комментарии в качестве ответа. Это не поможет. Как только у вас будет достаточная репутация, вы можете добавлять комментарии к OP.

Ответ №2:

Вероятно, это наименее питонистский способ решения этой проблемы, но он использует только то, чему до этого момента обучали в книге. Он работает со всеми символами, кроме (обратная косая черта).

 import re

def regexStrip(string,characters):
    mo = spaceStripRegex.search(string) # Calls upon the global regex for separating left and right white space from content
    string = mo.group(2)    # Isolates the string content from bounding white space and re-assigns it to a variable
    
    characters = '['   characters   ']' # Stores other characters to be stripped in format compatible with character class
    
    # Regex for stripping other characters contains argument built via string concatenation as opposed to single raw string
    characterStripRegex = re.compile(
        '^'   characters   '*'      # Zero or more of the characters to be stripped on left side of content
        r'(.*?)'    # Defines unstripped content as the only group. Nongreedy so as not to include characters to be stripped on right side 
        characters   '*$')  # Zero or more of the characters to be stripped on the right side of the content
    mo = characterStripRegex.search(string)
    string = mo.group(1)
    print(string)
    
# Global regex that groups initial string into left white space, content, and right white space
spaceStripRegex = re.compile(r'''
    ^(s)*  # Left white space if any
    (.*?)   # String content
    (s)*$  # Right white space if any
    ''', re.VERBOSE)

string = '  **SpamSpamBaconSpamEggsSpamSpam   '
characters = 'ampS*'

regexStrip(string,characters)