我不确定该称呼什么,如果您认为有更好的名字,请随时进行编辑。
我想做的是找到符合某些搜索条件的病例。
具体地说,我正在尝试查找其中包含“ where”一词的句子。一旦确定了这一点,我将尝试查找在同一标记中也包含“ SQL”命令的情况。
假设我有一个看起来像这样的数据框:
search_criteria = ['where']
df4
Q R
0 file.sql <sentence>dave likes stuff</sentence><properties>version = "2", description = "example" type="SqlCommand">select id, name, from table where criteria = '5'</property><sentence>dave hates stuff>
0 file.sql <sentence>dave likes stuff</sentence><properties>version = "2", description = "example">select id, name, from table where criteria = '5'</properties><sentence>dave hates stuff>
我正在尝试退回此商品:
Q R
0 file.sql <properties>version = "2", description = "example">select id, name, from table</properties>
该记录应返回,因为它同时包含“ where”和“ sqlcommand”。
这是我当前的流程:
regex_stuff = df_all_xml_mfiles_tgther[cc:cc+1].R.str.findall('(<[^<]*?' + 'where' + '[^>]*?>)', re.IGNORECASE)
sql_command_regex_stuff = df_all_xml_mfiles_tgther[cc:cc+1].R.str.findall('(<property[^<]*?' + 'sqlcommand' + '[^>]*?<\/property>)', re.IGNORECASE)
if not regex_stuff.empty: #if one of the search criteria is found
if not sql_command_regex_stuff.empty: #check to see if the phrase "sqlcommand" is found anywhere as well
(insert rest of code)
这不返回任何内容。
我在做什么错了?
编辑#1:
看来我需要在最后做些事情,以使正则表达式看起来像这样:
<property[^<]*?SqlCommand[^(<\/property>)]*
我觉得这是正确的方向,没有用,但是我觉得这是正确的步骤。
答案 0 :(得分:0)
您可以仅使用str.contains
进行过滤:
df[(df['R'].str.contains('where', flags=re.IGNORECASE) & df['R'].str.contains('sqlcommand', flags=re.IGNORECASE))]
Q R
0 file.sql <sentence>dave likes stuff</sentence><properti...
或使用~
返回相反的内容:不包含“ sqlcommand”或“ where”的字符串
df[~(df['R'].str.contains('where', flags=re.IGNORECASE) & df['R'].str.contains('sqlcommand', flags=re.IGNORECASE))]
Q R
1 file.sql <sentence>dave likes stuff</sentence><properti...
答案 1 :(得分:0)
首先,您必须具有适当的XML和SQL内容,因此您应该 进行以下更正:
由于开始标记为<properties>
,因此结束标记也必须为
</properties>
,而不是</property>
。
version
,description
和type
是属性(在它们之后
>
关闭了开始标签,因此properties
之后
应该是一个空格,而不是>
。
在,
之后删除version="2"
。
在,
之后删除name
。
在(
之前删除<properties
,在)
之后删除</properties>
。
要查找所需的行,请使用str.contains
作为过滤条件
表达。
下面有一个示例程序:
import pandas as pd
import re
df4 = pd.DataFrame({
'Q' : 'file.sql',
'R' : [
'<s>dave</s><properties type="SqlCommand">select id, name '
'from table where criteria=\'5\'</properties><s>dave</s>',
'<s>dave</s><properties>select id, name from table '
'where criteria=\'6\'</properties><s>dave</s>',
'<s>mike</s><properties type="SqlCommand">drop table "Xyz"'
'</properties><s>mike</s>' ]})
df5 = df4[df4.R.str.contains(
'<properties[^<>]+?sqlcommand[^<>]+?>[^<>]+?where',
flags=re.IGNORECASE)]
print(df5)
请注意,正则表达式会注意 字符串:
<properties
。<
和>
([^<>]+?
)以外的一系列字符。
所以我们仍然在刚刚打开的XML标签内。sqlcommand
(忽略大小写)。<
和>
以外的其他字符序列
([^<>]+?
。>
,关闭标签。<
和>
以外的其他字符序列
([^<>]+?
。where
(也忽略大小写)。尝试在两个单独的位置检查sqlcommand
和where
正则表达式是错误的,因为这些词可能在其他位置,
不符合您的要求。