我有一个字符串:
key_col = ['col1','col2']
df_with_idx = df.reset_index()
common = pd.merge(df_with_idx,other,on=key_col)['index']
mask = df_with_idx['index'].isin(common)
desired_result = df_with_idx[~mask].drop('index',axis=1)
我想在std::string String = "<!\\[LOG\\[somestringhere\\]LOG\\]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponenet\" context=\"\" type=\"1\" thread=\"0\" file=\"mxyfile.cpp\"><!\\[LOG\\[somestringhere\\]LOG\\]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponenet\" context=\"\" type=\"1\" thread=\"0\" file=\"mxyfile.cpp\">";
符号后面\n
><![LOG[
插入>
个字符。
到目前为止我的代码:
#include <regex>
const std::tr1::regex pattern( "(>|\")<!\\[LOG\\[" );
std::string replace = ">\n<![LOG[";
std::string newtext = std::tr1::regex_replace( String, pattern, replace );
std::cout << newtext << std::endl;
这很好用,但不幸的是有一点问题。并非每一行都以>
结尾。在某些情况下,应保留\"<!\\[LOG\\[
而不是><!\\[LOG\\[
。
如果缺少上一个>
,那么结果将是"\n<![LOG[
而不是>\n<![LOG[
。
所以我的问题是,解决这个问题的最简单/最好的方法是什么? 我应该以某种方式检查模式是否存在,然后相应地设置替换字符串?
希望我想要的是可以理解的。
感谢。
更新
对不起,但正如我所看到的,我犯了一个错误,字符串看起来如何,这引起了一些误解。
日志文件中的字符串(我将日志文件读入std :: string并进行处理)如下所示。这实际上是两行,但缺少换行符,这就是我要插入的内容。
情况1:
字符串看起来像这样:
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp"><![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp">
从此我想得到结果:
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp">**LineBreakHere**
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp">
请注意换行符的位置。
案例2:
字符串几乎如下:
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp"<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp"
请注意,>
file="myfile.cpp"
如果是这种情况,我希望得到与以前相同的结果:
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp">**LineBreakHere and the missing > was also inserted**
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp"> **also inserted missing >**
所以基本上,我想插入换行符,如果缺少>
我也想插入它,如果可能的话。
答案 0 :(得分:1)
你的正则表达式应该是
"(>|\")<!\\\\\\[LOG\\\\\\["
\
的4个斜线和2个用于转出方括号的斜杠。编写regexp的更好方法是使用R"(...)"
表示法(&#34;原始字符串文字&#34;):
const std::regex pattern( R"((>|\")<!\\\[LOG\\\[)" );
代码将是:
const std::regex pattern( R"((>|\")<!\\\[LOG\\\[)" );
std::string String = "<!\\[LOG\\[somestringhere\\]LOG\\]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponenet\" context=\"\" type=\"1\" thread=\"0\" file=\"mxyfile.cpp\"><!\\[LOG\\[somestringhere\\]LOG\\]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponenet\" context=\"\" type=\"1\" thread=\"0\" file=\"mxyfile.cpp\">";
std::string replace = "$1\n<![LOG[";
std::string newtext = std::regex_replace( String, pattern, replace );
std::cout << newtext << std::endl;
nextext
是
<!\[LOG\[somestringhere\]LOG\]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponenet" context="" type="1" thread="0" file="mxyfile.cpp">
<![LOG[somestringhere\]LOG\]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponenet" context="" type="1" thread="0" file="mxyfile.cpp">
请注意,替换字符串现在包含对第一个捕获组(由括号$1
内的子模式匹配的组)的反向引用(<|\")
,我们可以在替换内部安全地恢复它。我用反斜杠修改了所有内容。
<强>更新强>:
您可以使用R"((<!\[LOG\[[\s\S]*?\]!><[^<]*)(\">?))"
正则表达式:
const std::regex pattern( R"((<!\[LOG\[[\s\S]*?\]!><[^<]*)(\">?))" );
std::string String = "<![LOG[somestring]LOG]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponent\" context=\"\" type=\"1\" thread=\"0\" file=\"myfile.cpp\"<![LOG[somestring]LOG]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponent\" context=\"\" type=\"1\" thread=\"0\" file=\"myfile.cpp\"";
std::string replace = "$1\">\n";
std::string newtext = std::regex_replace( String, pattern, replace );
std::cout << newtext << std::endl;
REGEX说明:
该模式有两个捕获组:一个捕获<![LOG[
的开头直到下一个节点的末尾((<!\[LOG\[[\s\S]*?\]!><[^<]*)
),另一个捕获具有右尖括号或报价仅为(">|")
。
(<!\[LOG\[
- 按字面意义匹配<![LOG[
(第一个捕获组的开头)[\s\S]*?
- 匹配0个或更多字符(甚至是换行符)\]!><
- 按字面意思匹配]!><
[^<]*)
- 匹配<
以外的0个或更多字符(第一个捕获组的结尾)(\">|\")
- 匹配并捕获">
或"
。您可以将其写为(\">?)
。