#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)