как сопоставить слово или предложение в этом Python регулярном выражении? - PullRequest
1 голос
/ 16 апреля 2020

Я неплохо знаком с регулярным выражением, но это сложно. Мне нужно найти такие примеры из оператора SQL case:

когда col_name = 'это может быть слово или предложение'

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

s = """when col_name = 'a sentence of words'"""

x = re.search("when\s(\w+)\s*=\s*\'(\w+)", s)

if x:
    print(x.group(1)) # this returns "col_name"
    print(x.group(2)) # this returns "a"

Я хочу, чтобы группа (2) возвратила "предложение слов", но я просто получаю первое слово. Эта часть может быть одним словом или несколькими. Как это сделать?

Когда я добавляю второй \ ', тогда я не получаю совпадения:

x = re.search("when\s(\w+)\s*=\s*\'(\w+)\'", s)

1 Ответ

1 голос
/ 16 апреля 2020

Вы можете сопоставить все символы, кроме одинарных кавычек, вместо сопоставления букв, цифр и знаков препинания (символы «слово») с шаблоном группы 2:

import re
s = """when col_name = 'a sentence of words'"""
x = re.search(r"when\s+(\w+)\s*=\s*'([^']+)", s)
if x:
    print(x.group(1)) # this returns "col_name"
    print(x.group(2)) # this returns "a sentence of words"

См. Python demo

[^'] - это класс символов с отрицанием, который соответствует любому символу, кроме одной кавычки, см. демонстрационное выражение regex .

В случае, если строка может содержать экранированные одинарные кавычки, вы можете заменить [^'] на

  • Если escape-символ равен ': ([^']*(?:''[^']*)*)
  • Если escape-символ равен \ : ([^\\']*(?:\\.[^'\\]*)*).

Обратите внимание на использование необработанного строкового литерала для определения шаблона регулярного выражения (все обратные косые черты внутри него обрабатываются как литеральные обратные косые черты).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...