一个Python正则表达式,用于查找反斜杠在C++;包括语句,除非它们是';我们在一起 我正在编写一个Python脚本来识别清理C++代码的地方。我很难找到一个正则表达式来检测include语句中反斜杠的使用情况,但是忽略在恰好使用反斜杠的字符串中使用反斜杠
每一行都以一个六位数开始,这是原始文件中的行号。下面是一个示例,其中我遇到的问题是字符串中的一个Python正则表达式,用于查找反斜杠在C++;包括语句,除非它们是';我们在一起 我正在编写一个Python脚本来识别清理C++代码的地方。我很难找到一个正则表达式来检测include语句中反斜杠的使用情况,但是忽略在恰好使用反斜杠的字符串中使用反斜杠,python,regex,Python,Regex,每一行都以一个六位数开始,这是原始文件中的行号。下面是一个示例,其中我遇到的问题是字符串中的\n、\t和\“导致匹配为假阳性: 000001#include "should\be\no\backslashes" 000002 QString code = 000003 "#include <QPushButton>\n#include \"some/thing\"\n{\n\tauto button = new QPushButton(parent);\n\tButton
\n、\t和\“
导致匹配为假阳性:
000001#include "should\be\no\backslashes"
000002 QString code =
000003 "#include <QPushButton>\n#include \"some/thing\"\n{\n\tauto button = new QPushButton(parent);\n\tButtonStyle::ApplyButtonStyling(*button);\n}\n";
000001#包括“应该\应该\没有\反斜杠”
000002 QString代码=
000003“#包含\n#包含\“某些/事物\”\n{\n\tauto button=new QPushButton(父项);\n\tButtonStyle::ApplyButtonStyling(*button);\n}\n”;
正则表达式应该使用组来匹配行号和匹配的文本
什么样的正则表达式可以匹配第一行的
include
,但可以防止包含include
和反斜杠转义序列的字符串出现误报?为什么不能只在正则表达式中包含\include
,而只在include语句中搜索反斜杠
如果以下正则表达式后跟一个#include
(与数字之间只有空格)和字符串中其他位置至少一个反斜杠,则它与字符串开头的6位数字匹配。它与第三个字符串不匹配,因为”
数字和#include
之间会破坏模式
r'^(\d{6})\s*(?=#include.*\\)'
此示例返回所需的结果:
import re
strings = [r'000001#include "should\benobackslashes"', r'000002 QString code =', r'000003 "#include <QPushButton>\n#include \"some/thing\"\n{\n\tauto button = new QPushButton(parent);\n\tButtonStyle::ApplyButtonStyling(*button);\n}\n";']
for string in strings:
m = re.search(r'(\d{6})(?=#include.*\\)', string)
try:
print(m.group(0))
except:
pass
虽然您的问题可能比这更复杂,但基于您的问题,我认为基于此的简单方法应该可行。以下是对我有效的方法:
regex = r'^(?P<line_num>\d{6})(?P<line>.*#include\s+(\".*\\.*\"|<.*\\.*>).*$)'
regex=r'^(?P\d{6})(?P.#include\s+(\“*\\.\”).$)
<代码> >我并没有试图创建一个和C++解析器一样复杂的东西。我只想找到C++中的风格问题,可以用正则表达式找到,也就是说,我正在尝试创建一个相对简单的LIT。你可以匹配,然后通过CalbButter删除后面的代码< >代码(m)^(\d{ 6 })([^ \r\n**)(\**)* /代码>这可能会导致跨越行的字符串出现问题。但是,您可以同时匹配字符串和include,这样就不会有问题了。例如“\start\\end string\”但是,您可以用这个(?m)^(\d{6})([^\S\r\n]*)(\\\\.*)(?=\r?\n | \Z)(?另外,
启动的指令比包含的指令更多。比如定义、pragma、if、else、endif等等。但是,我认为includes不能跨行(虽然不确定)。如果你能展示你所做的尝试,而不是期待有人向你展示如何做到这一点,这会有所帮助。
regex = r'^(?P<line_num>\d{6})(?P<line>.*#include\s+(\".*\\.*\"|<.*\\.*>).*$)'