熊猫Python正则表达式帮助

时间:2018-09-05 15:33:36

标签: python python-3.x pandas

我不确定该称呼什么,如果您认为有更好的名字,请随时进行编辑。

我想做的是找到符合某些搜索条件的病例。

具体地说,我正在尝试查找其中包含“ 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>)]*

我觉得这是正确的方向,没有用,但是我觉得这是正确的步骤。

2 个答案:

答案 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内容,因此您应该 进行以下更正:

  1. 由于开始标记为<properties>,因此结束标记也必须为 </properties>,而不是</property>

  2. versiondescriptiontype属性(在它们之后 >关闭了开始标签,因此properties之后 应该是一个空格,而不是>

  3. ,之后删除version="2"

  4. ,之后删除name

  5. (之前删除<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(也忽略大小写)。

尝试在两个单独的位置检查sqlcommandwhere 正则表达式是错误的,因为这些词可能在其他位置, 不符合您的要求。