Если мой рисунок группа не содержит символ новой строки (\n
) характер, все работает отлично:Regex замена не работает, если группа содержит флаг новой строки
contents = b'''
xdlg::xdlg(x_app* pApp, CWnd* pParent)
: customized_dlg((UINT)0, pParent, pApp)
'''
pattern = rb'(\w+)(::)(\1)'
res = re.search(pattern, contents, re.DOTALL | re.MULTILINE)
if None != res:
print(res.groups()) # output is: (b'xdlg', b'::', b'xdlg')
sub = rb"\1--\2--\1"
contents = re.sub(pattern, sub, contents, re.DOTALL | re.MULTILINE)
print(contents) # output is b'\nxdlg--::--xdlg...(to save space, unchanged string is ignored)
, но если я изменю pattern
содержать '\n'
, re.sub
терпит неудачу изменить contents
:
pattern = rb'(\w+)(::)(\1)(.*\n*:\n*.*)(\(UINT\)0)'
res = re.search(pattern, contents, re.DOTALL | re.MULTILINE)
if None != res:
print(res.groups()) # output is (b'xdlg', b'::', b'xdlg', b'(x_app* pApp, CWnd* pParent)\n\t: customized_dlg(', b'(UINT)0')
sub = rb"\1--\2--\1"
contents = re.sub(pattern, sub, contents, re.DOTALL | re.MULTILINE)
print(contents) # the output doesn't change anything!
что я здесь делаю неправильно?
(я использую Python 3.4.2)
Почему вы используете '. * \ N *: \ n * \. *'? С флагом 're.DOTALL' вы можете просто написать'. *:. * 'Или даже лучше' [^:] *: [^ (] * '(что, вероятно, было бы более эффективным). – Bakuriu
' (. * \ n *: \ n *. *) 'Это не соответствует' \ n: '. Вы пропускаете пробелы/вкладки перед': ' – dhke
@dhke, по сути, '. *' не может пропустить ничего с 're.DOTALL' –