0

現在、以下の正規表現はコメント内のコメントにも一致しています。たとえば、以下の入力では、test1 と test2 の両方に一致します。

import re
string="""
/*
 * devkit (c) 2012-2013, ARM-3.4. aLL DATA conf.
 *

 *
 */
/*
 * devkit (c) 2012, ARM-3.4. aLL DATA conf.
 *
 *
 */

#ifndef code_abc_WDI_H
#define code_abc_WDI_H
"""
text="devkit \(c\) 2012, ARM-3.4. aLL DATA conf"

pattern = re.compile(r'/\*.*?'+ re.escape(text) + '.*?\*/', re.DOTALL)
print re.sub(pattern, "", string)

出力:-

/*
 * devkit (c) 2012-2013, ARM-3.4. aLL DATA conf.
 *

 *
 */

#ifndef code_abc_WDI_H
#define code_abc_WDI_H
4

1 に答える 1

2

まず、\(入力\)テキストを二重にエスケープするため、入力と一致しません。

>>> re.escape(text)
'devkit\\ \\\\\\(c\\\\\\)\\ 2012\\,\\ ARM\\-3\\.4\\.\\ aLL\\ DATA\\ conf'

次のように再定義textします。

text="devkit (c) 2012, ARM-3.4. aLL DATA conf"

またはコメントの開始文字と終了文字以外のものと一致させるには、否定的なルックアラウンドを使用する必要があります。/**/

pattern = re.compile(r'/\*(?:[^/]|(?<!\*)/)*?' + re.escape(text) + r'(?:[^/]|/(?!\*))*?\*/')

したがって、これは、スラッシュではない/*0 個以上の文字 (貪欲ではない/) が後に続くか、またはスラッシュであるが . が前に付いていない場合にのみ一致し*ます。文字列のもう一方の端で、/*パターンに対して同じことを行います。スラッシュは許可されますが、その後に . が続かない場合に限り*ます。

ドット演算子re.DOTALLを使用しなくなったため、もう必要ありません。.

これは正しく動作します:

>>> text = "devkit (c) 2012, ARM-3.4. aLL DATA conf"
>>> pattern = re.compile(r'/\*(?:[^/]|(?<!\*)/)*?' + re.escape(text) + r'(?:[^/]|/(?!\*))*?\*/')
>>> pattern.sub("", string)
'/*\n * devkit (c) 2012-2013, ARM-3.4. aLL DATA conf.\n *\n\n *\n */\n\n\n#ifndef code_abc_WDI_H\n#define code_abc_WDI_H\n'
>>> print pattern.sub("", input)
/*
 * devkit (c) 2012-2013, ARM-3.4. aLL DATA conf.
 *

 *
 */


#ifndef code_abc_WDI_H
#define code_abc_WDI_H
于 2013-01-10T08:43:32.033 に答える