Извлечь подстроку из строки с помощью регулярных выражений - PullRequest
2 голосов
/ 16 мая 2019

У меня есть требование, мне нужно извлечь подстроку из строки, используя регулярное выражение.

например, вот мои образцы данных:

Hello, "How" are "you" What "are" you "doing?"

из данных этого примера мне нужно извлечь только второе и четвертое вхождения данных в двойных кавычках.

мое требование: you doing?

Я пробовал с регулярным выражением ниже, но я не могу извлечь в соответствии с моим требованием.

"(.*?)"

Ответы [ 3 ]

2 голосов
/ 16 мая 2019

Мы можем использовать re.findall и затем нарезать результат, чтобы получить первое и третье совпадения:

import re

string = 'Hello, "How" are "you" What "are" you "doing?"'
result = re.findall('".+?"', string)[1::2]

print(result)

Здесь регулярное выражение соответствует любому количеству символов, содержащихся в двойных кавычках, но пытается найти как можно меньше совпадений ( не жадное совпадение ), в противном случае мы получим одно совпадение, "How" are "you" What "are" you "doing?".

Выход:

['"you"', '"doing?"']

Если вы хотите объединить их без кавычек, вы можете использовать str.strip вместе с str.join:

print(' '.join(string.strip('"') for string in result))

Выход:

you doing?

Альтернативным методом было бы просто разделить на ":

result = string.split('"')[1::2][1::2]
print(result)

Вывод:

['you', 'doing?']

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

  1. Все до первой двойной кавычки
  2. Все после первой двойной кавычки и перед второй
  3. Всё после второй двойной кавычки и перед третьей ...

Это означает, что мы можем взять каждый четный элемент, чтобы получить те, которые в кавычках. Затем мы можем просто нарезать результат снова, чтобы получить 2-й и 4-й результаты.

1 голос
/ 16 мая 2019

Regex только решение.Может быть не на 100% точным, поскольку соответствует каждому второму вхождению, а не только 2-му и 4-му, но это работает для примера.

"[^"]+"[^"]+("[^"]+")

Демонстрация в JS:

var str = 'Hello, "How" are "you" What "are" you "doing?"';
var regex = /"[^"]+"[^"]+("[^"]+")/g
match = regex.exec(str);
while (match != null) {
   // matched text: match[0]
   // match start: match.index
   // capturing group n: match[n]
  console.log(match[1])
  match = regex.exec(str);
}
0 голосов
/ 16 мая 2019

Мы можем попытаться использовать re.findall для извлечения всех указанных условий. Затем создайте строку, используя только четные записи в результирующем списке:

input = "Hello, \"How\" are \"you\" What \"are\" you \"doing?\""
matches = re.findall(r'\"([^"]+)\"', input)
matches = matches[1::2]
output = " ".join(matches)
print(output)

you doing?
...