我有一个.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");
}
答案 0 :(得分:1)
您可以使用
r'(?s)(?<!\\)(?:\\\\)*(L)?"([^"\\]*(?:\\.[^"\\]*)*)"'
如果组1是无,则将匹配附加到CHAR类型字符串,否则匹配的字符串是WCHAR类型,您可以获取组2值。
<强>详情
(?s)
- DOTALL修饰符,让.
匹配任何字符(?<!\\)
- 不在\
(?:\\\\)*
- 零个或多个连续的双反斜杠(以避免在文字反斜杠后匹配转义的引号)(L)?
- 第1组:可选L
"
- 双引号([^"\\]*(?:\\.[^"\\]*)*)
- 第2组:
[^"\\]*
- 反斜杠以外的任何0 +字符"
(?:\\.[^"\\]*)*
- 连续出现0次以上
\\.
- 任何以反斜杠转义的字符[^"\\]*
- 反斜杠以外的任何0 +字符"
"
- 结束双引号。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