使用正则表达式

时间:2018-06-06 07:03:44

标签: python regex

我有一个字符串

                  /* @TS 1 : This is the comment
                   * for method1
                   */
                  /* @TS 2 : This is the comment
                   * for method2
                   */

我需要将每个索引值(1,2)映射到该内容 例如:1 - >这是方法1的注释。

我使用正则表达式

编写了以下Python程序
/*commentLine contains the string of data */

regex = r"/\*([^*]|[\r\n]|(\*([^/]|[\r\n])))*\*/"
for match in re.finditer(regex, commentLine):
    if ':' in commentLine:
        commentLine = commentLine[commentLine.index(':') + 1:]
    commentgroup = match.group()
    if '@TS' in commentgroup:
        commentgroup = commentgroup.replace('@TS', '')
        print(commentgroup)

但在这里,我需要更换@TS,我需要找出数字所在的位置。是否有任何正则表达式将组编号作为一个组,并将(:)作为一个组后的内容?

编辑: 预期结果:{' 1' :'这是方法1',' 2'的注释:'这是方法2的评论' }

1 个答案:

答案 0 :(得分:1)

您可以使用

import re
s = "/* @TS 1 : This is the comment\n* for method1\n*/\n/* @TS 2 : This is the comment\n* for method2\n*/"
rx = r'/\*+\s*@TS\s*(\d+)\s*:([^*]*\*+(?:[^/*][^*]*\*+)*/)'
d = {}
for match in re.finditer(rx, s):
    d[match.group(1)] = re.sub(r"(?:^|[\r\n]+)\s*\*\s*", "", match.group(2)[:-2].strip())

print(d) # => {'1': 'This is the commentfor method1', '2': 'This is the commentfor method2'}

请参阅Python demo

这里有几点需要注意。

模式详情

  • /\*+ - 在
  • 之后匹配评论开始/*和任何0 + * s
  • \s* - 0+ whitespaces
  • @TS - 文字子字符串
  • \s* - 0+ whitespaces
  • (\d+) - 第1组:一个或多个数字
  • \s*: - 0+空格和:
  • ([^*]*\*+ - (第2组开始):匹配*以外的0 +个字符,后跟1 +字面*
  • (?:[^/*][^*]*\*+)* - 0+序列:
    • [^/*][^*]*\*+ - 不是/*(与[^/*]匹配),后跟0 +非星号字符([^*]*),后跟1 +星号(\*+
  • /) - 关闭/(第2组结束)

请参阅regex demo

代码详情

使用d = {}定义空字典。然后,所有匹配都会找到re.finditermatch.group(1)是关键,而match.group(2)包含需要“修剪”一下的值。最后2个字符会被[:-2]删除(因为它们是*/),然后从空格(.strip())中删除该值,然后使用(?:^|[\r\n]+)\s*\*\s*模式删除所有字符*在字符串/行的开头包含空格。