Pandas Python Помощь в регулярных выражениях - PullRequest
0 голосов
/ 05 сентября 2018

Я не был уверен, как назвать этот заголовок, не стесняйтесь редактировать его, если вы думаете, что есть лучшее имя.

Я пытаюсь найти случаи, которые соответствуют определенным критериям поиска.

В частности, я пытаюсь найти предложения, содержащие в себе слово «где». После того, как я это определил, я пытаюсь найти случаи, когда команда «SQL» также находится в этом же теге.

Допустим, у меня есть кадр данных, который выглядит следующим образом:

search_criteria = ['где']

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 голосов
/ 05 сентября 2018

Прежде всего, вы должны иметь правильный контент XML и SQL, так что вы должны внести следующие исправления:

  1. Поскольку открывающий тег - <properties>, закрывающий тег также должен быть </properties>, а не </property>.

  2. version, description и type являются атрибутами (после них > закрывает открывающий тег, поэтому после 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 (также без учета регистра).

Попытка проверить sqlcommand и where в двух отдельных регулярные выражения неправильны, так как эти слова могут быть в других местах, которые не соответствуют вашим требованиям.

0 голосов
/ 05 сентября 2018

Вы можете просто отфильтровать с помощью 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» или «где»

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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...