如何使用python正则表达式查找文件中的所有字符字符串

2024-10-04 01:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

CHAR字符串的特点是它们只出现在引号中。你知道吗

WCHAR字符串的特点是它们出现在字母L前面的引号中

字符串字符示例: "char 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");
}

Tags: 文件of字符串re示例string字母line
1条回答
网友
1楼 · 发布于 2024-10-04 01:28:56

你可以用

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

如果组1是None,则将匹配项附加到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

相关问题 更多 >