Возвращать отдельные совпадения не одно регулярное выражение

Я уверен, что на SO должен быть ответ, но мой гугл-фу меня подводит.

У меня есть файл js, который содержит массив словарей javascript, который начинается как:

var a = t.locales = [{ countryCode: "AF", countryName: "Afghanistan" }, { countryCode: "AL", countryName: "Albania" }, 

Всего 3 ответа


Используйте не жадную версию вашего первого варианта:

p = re.compile(r'countryName:"(.*?)"')     
countries = p.findall(text)

Проблема с использованием жадного совпадения типа "(.*)" Заключается в том, что оно будет совпадать до конца последнего " .

{countryCode:"AF",countryName:"Afghanistan"},{countryCode:"AL",countryName:"Albania"}
                  ^match  ^ capture start ^ still matches .*      final match of " ^

Тем не менее, вы хотите, чтобы он заканчивался наименьшим соответствием - что выражается не жадным соответствием

{countryCode:"AF",countryName:"Afghanistan"},{countryCode:"AL",countryName:"Albania"}
                  ^match  ^ capture start ^ first match of "

Используйте шаблон r'countryName:"(.*?)"'

Пример:

import re
data = '[{countryCode:"AF",countryName:"Afghanistan"},{countryCode:"AL",countryName:"Albania"},{countryCode:"DZ",countryName:"Algeria"},{countryCode:"AS",countryName:"American Samoa"},{countryCode:"AD",countryName:"Andorra"},{countryCode:"AO",countryName:"Angola"},{countryCode:"AI",countryName:"Anguilla"},{countryCode:"AG",countryName:"Antigua & Barbuda"},{countryCode:"AR",countryName:"Argentina"},{countryCode:"AM",countryName:"Armenia"},{countryCode:"AW",countryName:"Aruba"},{countryCode:"AU",countryName:"Australia"},{countryCode:"AT",countryName:"Austria"},{countryCode:"AZ",countryName:"Azerbaijan"},{countryCode:"BS",countryName:"Bahamas"},{countryCode:"BH",countryName:"Bahrain"},{countryCode:"BD",countryName:"Bangladesh"},{countryCode:"BB",countryName:"Barbados"},{countryCode:"BY",countryName:"Belarus"},{countryCode:"BE",countryName:"Belgium"},{countryCode:"BZ",countryName:"Belize"},{countryCode:"BJ",countryName:"Benin"},{countryCode:"BM",countryName:"Bermuda"},{countryCode:"BT",countryName:"Bhutan"},{countryCode:"BO",countryName:"Bolivia"},{countryCode:"BQ",countryName:"Bonaire"},{countryCode:"BA",countryName:"Bosnia & Herzegovina"},{countryCode:"BW",countryName:"Botswana"}]'
countries = re.findall(r'countryName:"(.*?)"', data)
print(countries)

Выход:

['Afghanistan',
 'Albania',
 'Algeria',
 'American Samoa',
 'Andorra',
 'Angola',
 'Anguilla',
 'Antigua & Barbuda',
 'Argentina',
 'Armenia',
 'Aruba',
 'Australia',
 'Austria',
 'Azerbaijan',
 'Bahamas',
 'Bahrain',
 'Bangladesh',
 'Barbados',
 'Belarus',
 'Belgium',
 'Belize',
 'Benin',
 'Bermuda',
 'Bhutan',
 'Bolivia',
 'Bonaire',
 'Bosnia & Herzegovina',
 'Botswana']

Вам нужно изменить свое регулярное выражение, чтобы использовать (?<=countryName: ")[^"]+ вместо текущего. Поскольку ваш текущий использует .* Который жадно сопоставляет все и, следовательно, будет сопоставлять все возможное, что и происходит в вашем случае.

Попробуйте эти коды Python,

import re

s = '''[{
        countryCode: "AF",
        countryName: "Afghanistan"
    }, {
        countryCode: "AL",
        countryName: "Albania"
    },'''

print(re.findall(r'(?<=countryName: ")[^"]+', s))

Отпечатки,

['Afghanistan', 'Albania']

Есть идеи?

10000