如何使用python regexs

时间:2018-04-18 10:27:25

标签: python regex

我有一个.CPP文件,其中包含两种类型的字符串

CHAR字符串的特点是它们只出现在引号内。

WCHAR个字符串的特点是它们出现在前面带有字母L

的引号中

字符串CHAR示例: "char string"

String WCHAR的示例: L"wchar string"

我想找到文件中的所有CHAR&(仅限它们),然后找到文件中的所有WCHAR&(仅限){

这是我目前的代码。他知道如何在引号之间找到字符串:

import re
#find all strings between ""
re.findall('"([^"]*)"', f.read())

#find all strings between L""
re.findall('L"([^"]*)"', f.read())

如果在第一个字母之前没有字母L,我怎么告诉他只给我带引号之间的字符串?

这是一个示例文件:

#include <stdio.h>


int main()
{   
    printf(L"very long first wchar\
    cuple of line\
    string");

    printf("regular char string");

    printf(L" wchar short string in bracket");

    printf("short string in bracket");

    printf("very long\
    cuple of line\
    string");


    printf(L"very long wchar\
    cuple of line\
    string");
}

1 个答案:

答案 0 :(得分:1)

您可以使用

r'(?s)(?<!\\)(?:\\\\)*(L)?"([^"\\]*(?:\\.[^"\\]*)*)"'

如果组1是,则将匹配附加到CHAR类型字符串,否则匹配的字符串是WCHAR类型,您可以获取组2值。

<强>详情

  • (?s) - DOTALL修饰符,让.匹配任何字符
  • (?<!\\) - 不在\
  • 之前的位置
  • (?:\\\\)* - 零个或多个连续的双反斜杠(以避免在文字反斜杠后匹配转义的引号)
  • (L)? - 第1组:可选L
  • " - 双引号
  • ([^"\\]*(?:\\.[^"\\]*)*) - 第2组:
    • [^"\\]* - 反斜杠以外的任何0 +字符"
    • (?:\\.[^"\\]*)* - 连续出现0次以上
      • \\. - 任何以反斜杠转义的字符
      • [^"\\]* - 反斜杠以外的任何0 +字符"
  • " - 结束双引号。

请参阅regex demoPython demo

import re
rx = r'''(?s)(?<!\\)(?:\\\\)*(L)?"([^"\\]*(?:\\.[^"\\]*)*)"'''
s = ("#include <stdio.h>\n\n\n"
    "int main()\n"
    "{       \n"
    "    printf(\"regular char string\");\n\n"
    "    printf(L\" wchar short string in bracket\");\n\n"
    "    printf(\"short string in bracket\");\n\n"
    "    printf(\"very long\\\n"
    "    cuple of line\\\n"
    "    string\");\n\n\n"
    "    printf(L\"very long wchar\\\n"
    "    cuple of line\\\n"
    "    string\");\n"
    "}")
chars_list = []
wchars_list = []
for m in re.finditer(rx, s):
    if m.group(1):
        wchars_list.append(m.group(2))
        print("WCHAR: {}".format(m.group(2)))
    else:
        chars_list.append(m.group(2))
        print("CHAR: {}".format(m.group(2)))

输出:

CHAR: regular char string
WCHAR:  wchar short string in bracket
CHAR: short string in bracket
CHAR: very long\
    cuple of line\
    string
WCHAR: very long wchar\
    cuple of line\
    string