正则表达式Python匹配大型字符串列表

时间:2012-08-10 13:37:04

标签: python regex

我有一大堆字符串,其中包括空格(例如“纽约”,“美国”,“北卡罗来纳州”,“阿拉伯联合酋长国”,“大不列颠及北爱尔兰联合王国”)。 。和大约5000多个这样的字符串)。

我有一个大文本,其中可能包含任何这些字符串(例如“我去北卡罗来纳州途中去了纽约,最终将前往阿拉伯联合酋长国。”)

有效使用正则表达式检测文本中是否存在这些字符串的最佳方法是什么?

或者我应该考虑另一种方式,这样我就可以从文本中提取bigrams,看看这个列表中的哪些字符串与这些bigrams相匹配?


编辑:

在与VoronoiPotato进行了一次有趣的讨论之后,我开始认为最好为大字符串列表的所有项目标记索引,并且我设法使用该函数执行此操作:

def indexing_list(li):
    index_dict={}
    for i in rl(li):
        words=li[i].split()
        for j in rl(words):
            index=complex(i,j)
            word=words[j].lower()
            try:
                index_dict[word].append(index)
            except:
                index_dict[word]=[index]
    return index_dict

尝试了这个清单:

[u'United Kingdom of Great Britain and Northern Ireland', u'Democratic People\u2019s Republic of Korea', u'Democratic Republic of the Congo', u'Lao People\u2019s Democratic Republic', u'Saint Vincent and the Grenadines', u'United Republic of Tanzania', u'Iran (Islamic Republic of)', u'Central African Republic', u'Islamic Republic of Iran', u'United States of America', u'Bosnia and Herzegovina', u'Libyan Arab Jamahiriya', u'Saint Kitts and Nevis', u'Sao Tome and Principe', u'Syrian Arab Republic', u'United Arab Emirates', u'Antigua and Barbuda', u'Trinidad and Tobago', u'Dominican Republic', u'Russian Federation', u'Brunei Darussalam', u'Equatorial Guinea', u'Republic of Korea', u'Marshall Islands', u'Papua New Guinea', u'Solomon Islands', u'ComodRivadavia', u'Port-au-Prince', u'DumontDUrville', u'Czech Republic', u'United Kingdom', u'Dar es Salaam', u'Cambridge Bay', u'Coral Harbour', u'Port of Spain', u'Santo Domingo', u'St Barthelemy', u'Swift Current', u'Ujung Pandang', u'Yekaterinburg', u'South Georgia', u'C\xf4te d\u2019Ivoire', u"Cote d'Ivoire", u'Guinea-Bissau', u'Liechtenstein', u'United States', u'Johannesburg', u'Buenos Aires', u'Rio Gallegos', u'Blanc-Sablon', u'Campo Grande', u'Danmarkshavn', u'Dawson Creek', u'Indianapolis', u'North Dakota', u'Rankin Inlet', u'Scoresbysund', u'Longyearbyen', u'Kuala Lumpur', u'Antananarivo', u'Port Moresby', u'Burkina Faso', u'Saudi Arabia', u'Sierra Leone', u'South Africa', u'Turkmenistan', u'Addis Ababa', u'Brazzaville', u'Ouagadougou', u'El Salvador', u'Los Angeles', u'Mexico City', u'Pangnirtung', u'Porto Velho', u'Puerto Rico', u'Rainy River', u'Tegucigalpa', u'Thunder Bay', u'Yellowknife', u'Ho Chi Minh', u'Krasnoyarsk', u'Novosibirsk', u'Ulaanbaatar', u'Vladivostok', u'Broken Hill', u'Isle of Man', u'Kaliningrad', u'Guadalcanal', u'Afghanistan', u'Cock Island', u'El Salvador', u'Netherlands', u'New Zealand', u'Philippines', u'Saint Lucia', u'Switzerland', u'Timor-Leste', u'Casablanca', u'Libreville', u'Lubumbashi', u'Nouakchott', u'Porto-Novo', u'Costa Rica', u'Fort Wayne', u'Grand Turk', u'Guadeloupe', u'Hermosillo', u'Petersburg', u'Louisville', u'Monticello', u'Martinique', u'Montevideo', u'Montserrat', u'Paramaribo', u'Porto Acre', u'Rio Branco', u'St Vincent', u'Whitehorse', u'Antarctica', u'South Pole', u'Choibalsan', u'Phnom Penh', u'Ulan Bator', u'Cape Verde', u'Queensland', u'Yancowinna', u'Bratislava', u'Copenhagen', u'Luxembourg', u'San Marino', u'Simferopol', u'Zaporozhye', u'Kiritimati', u'Yugoslavia', u'Azerbaijan', u'Bangladesh', u'Cape Verde', u'Costa Rica', u'Kazakhstan', u'Kyrgyzstan', u'Luxembourg', u'Madagascar', u'Mauritania', u'Micronesia', u'Montenegro', u'Mozambique', u'San Marino', u'Seychelles', u'Tajikistan', u'Uzbekistan', u'Bujumbura', u'Mogadishu', u'Anchorage', u'Araguaina', u'Catamarca', u'Boa Vista', u'Chihuahua', u'Fortaleza', u'Glace Bay', u'Goose Bay', u'Guatemala', u'Guayaquil', u'Tell City', u'Vincennes', u'Menominee', u'Monterrey', u'New Salem', u'Sao Paulo', u'St Thomas', u'Vancouver', u'Ashkhabad', u'Chongqing', u'Chungking', u'Hong Kong', u'Jerusalem', u'Kamchatka', u'Pontianak', u'Pyongyang', u'Qyzylorda', u'Samarkand', u'Singapore', u'Vientiane', u'Jan Mayen', u'Reykjavik', u'St Helena', u'Australia', u'Lord Howe', u'Melbourne', u'Greenwich', u'Amsterdam', u'Bucharest', u'Gibraltar', u'Ljubljana', u'Mariehamn', u'Podgorica', u'Stockholm', u'Volgograd', u'Christmas', u'Kerguelen', u'Mauritius', u'Enderbury', u'Galapagos', u'Kwajalein', u'Marquesas', u'Pago Pago', u'Rarotonga', u'Tongatapu', u'Argentina', u'Australia', u'Guatemala', u'Indonesia', u'Lithuania', u'Mauritius', u'Nicaragua', u'Singapore', u'Sri Lanka', u'Swaziland', u'Macedonia', u'Venezuela', u'Blantyre', u'Djibouti', u'El Aaiun', u'Freetown', u'Gaborone', u'Khartoum', u'Kinshasa', u'Monrovia', u'Ndjamena', u'Sao Tome', u'Timbuktu', u'Windhoek', u'Anguilla', u'La Rioja', u'San Juan', u'San Luis', u'Asuncion', u'Atikokan', u'Barbados', u'Dominica', u'Edmonton', u'Eirunepe', u'Ensenada', u'Kentucky', u'Mazatlan', u'Miquelon', u'Montreal', u'New York', u'Resolute', u'Santiago', u'Shiprock', u'St Johns', u'St Kitts', u'St Lucia', u'Winnipeg', u'Ashgabat', u'Calcutta', u'Damascus', u'Dushanbe', u'Istanbul', u'Jayapura', u'Katmandu', u'Makassar', u'Sakhalin', u'Shanghai', u'Tashkent', u'Tel Aviv', u'Atlantic', u'Adelaide', u'Brisbane', u'Canberra', u'Lindeman', u'Tasmania', u'Victoria', u'Belgrade', u'Brussels', u'Budapest', u'Chisinau', u'Guernsey', u'Helsinki', u'Sarajevo', u'Tiraspol', u'Uzhgorod', u'Auckland', u'Funafuti', u'Honolulu', u'Johnston', u'Pitcairn', u'Barbados', u'Botswana', u'Bulgaria', u'Cambodia', u'Cameroon', u'Colombia', u'Djibouti', u'Dominica', u'Ethiopia', u'Holy See', u'Honduras', u'Kiribati', u'Malaysia', u'Maldives', u'Mongolia', u'Pakistan', u'Paraguay', u'Portugal', u'Slovakia', u'Slovenia', u'Suriname', u'Thailand', u'Tanzania', u'Viet Nam', u'Zimbabwe', u'Anguilla', u'Abidjan', u'Algiers', u'Conakry', u'Kampala', u'Mbabane', u'Nairobi', u'Tripoli', u'America', u'Antigua', u'Cordoba', u'Mendoza', u'Tucuman', u'Ushuaia', u'Caracas', u'Cayenne', u'Chicago', u'Curacao', u'Detroit', u'Godthab', u'Grenada', u'Halifax', u'Indiana', u'Marengo', u'Winamac', u'Iqaluit', u'Managua', u'Marigot', u'Moncton', u'Nipigon', u'Noronha', u'Phoenix', u'Rosario', u'Tijuana', u'Toronto', u'Tortola', u'Yakutat', u'McMurdo', u'Rothera', u'Baghdad', u'Bahrain', u'Bangkok', u'Bishkek', u'Colombo', u'Irkutsk', u'Jakarta', u'Karachi', u'Kashgar', u'Kolkata', u'Kuching', u'Magadan', u'Nicosia', u'Rangoon', u'Tbilisi', u'Thimphu', u'Yakutsk', u'Yerevan', u'Bermuda', u'Madeira', u'Stanley', u'Andorra', u'Belfast', u'Tallinn', u'Vatican', u'Vilnius', u'Mayotte', u'Reunion', u'Chatham', u'Fakaofo', u'Gambier', u'Norfolk', u'Albania', u'Algeria', u'Armenia', u'Austria', u'Bahamas', u'Bahrain', u'Belarus', u'Belgium', u'Bolivia', u'Burundi', u'Comoros', u'Croatia', u'Denmark', u'Ecuador', u'Eritrea', u'Estonia', u'Finland', u'Georgia', u'Germany', u'Grenada', u'Hungary', u'Iceland', u'Ireland', u'Jamaica', u'Lebanon', u'Lesotho', u'Liberia', u'Morocco', u'Myanmar', u'Namibia', u'Nigeria', u'Moldova', u'Romania', u'Senegal', u'Somalia', u'Tunisia', u'Ukraine', u'Uruguay', u'Vanuatu', u'Asmara', u'Asmera', u'Bamako', u'Bangui', u'Banjul', u'Bissau', u'Douala', u'Harare', u'Kigali', u'Luanda', u'Lusaka', u'Malabo', u'Maputo', u'Maseru', u'Niamey', u'Belize', u'Bogota', u'Cancun', u'Cayman', u'Cuiaba', u'Dawson', u'Denver', u'Havana', u'Inuvik', u'Juneau', u'La Paz', u'Maceio', u'Manaus', u'Merida', u'Nassau', u'Recife', u'Regina', u'Virgin', u'Mawson', u'Palmer', u'Vostok', u'Arctic', u'Almaty', u'Anadyr', u'Aqtobe', u'Beirut', u'Brunei', u'Harbin', u'Kuwait', u'Manila', u'Muscat', u'Riyadh', u'Saigon', u'Taipei', u'Tehran', u'Thimbu', u'Urumqi', u'Azores', u'Canary', u'Faeroe', u'Currie', u'Darwin', u'Hobart', u'Sydney', u'Europe', u'Athens', u'Berlin', u'Dublin', u'Jersey', u'Lisbon', u'London', u'Madrid', u'Geneva', u'Monaco', u'Moscow', u'Prague', u'Samara', u'Skopje', u'Tirane', u'Vienna', u'Warsaw', u'Zagreb', u'Zurich', u'Chagos', u'Comoro', u'Easter', u'Kosrae', u'Majuro', u'Midway', u'Noumea', u'Ponape', u'Saipan', u'Tahiti', u'Tarawa', u'Wallis', u'Andora', u'Angola', u'Belize', u'Bhutan', u'Brazil', u'Canada', u'Cyprus', u'France', u'Gambia', u'Greece', u'Guinea', u'Guyana', u'Israel', u'Jordan', u'Kuwait', u'Latvia', u'Malawi', u'Mexico', u'Monaco', u'Norway', u'Panama', u'Poland', u'Rwanda', u'Serbia', u'Sweden', u'Turkey', u'Tuvalu', u'Uganda', u'Zambia', u'Accra', u'Cairo', u'Ceuta', u'Dakar', u'Lagos', u'Tunis', u'Jujuy', u'Aruba', u'Bahia', u'Belem', u'Boise', u'Vevay', u'Thule', u'Casey', u'Davis', u'Syowa', u'Amman', u'Aqtau', u'Dacca', u'Dhaka', u'Dubai', u'Kabul', u'Macao', u'Macau', u'Qatar', u'Seoul', u'Tokyo', u'Faroe', u'Eucla', u'Perth', u'Malta', u'Minsk', u'Paris', u'Sofia', u'Vaduz', u'Cocos', u'Efate', u'Nauru', u'Palau', u'Samoa', u'Benin', u'Chile', u'China', u'Congo', u'Egypt', u'Gabon', u'Ghana', u'Haiti', u'India', u'Italy', u'Japan', u'Kenya', u'Libya', u'Malta', u'Nauru', u'Nepal', u'Niger', u'Palau', u'Qatar', u'Samoa', u'Spain', u'Sudan', u'Syria', u'Tonga', u'Yemen', u'Lome', u'Adak', u'Atka', u'Nuuk', u'Knox', u'Lima', u'Nome', u'Asia', u'Aden', u'Baku', u'Dili', u'Gaza', u'Hovd', u'Omsk', u'Oral', u'Zulu', u'Kiev', u'Oslo', u'Bonn', u'Riga', u'Rome', u'Mahe', u'Apia', u'Fiji', u'Guam', u'Niue', u'Truk', u'Wake', u'Chad', u'Cuba', u'Fiji', u'Iran', u'Iraq', u'Mali', u'Oman', u'Peru', u'Togo', u'GMT', u'Yap']

然后我开始分析我的文字:

text='I went to New York and New Orleans and London and United States, Canada, and Egypt, Saudi Arabia'
text_words=text.split()

并尝试分别调查每个单词:

for i in rl(text_words):
    tw=text_words[i].lower()
    print i
    print tw
    print index_dict.get(tw)

方法似乎很快,但我不确定如何进一步采取

6 个答案:

答案 0 :(得分:10)

whitespaces_list=['New York','United States', 'United Arab Emirates']
large_text="I went to New York on my way to North Carolina, and eventually will be going to United Arab Emirates."
for i in whitespaces_list:
    if i in large_text:
        print i," Exist in Large text"
你正在寻找这样的东西吗?

答案 1 :(得分:5)

正如大多数人所说,这取决于您的文本城市列表,使用timeit比较方法是选择哪种方式的最佳方式去:

list = ['New York','United States', 'United Arab Emirates']
text = "I went to New York on my way to North Carolina, and eventually will be going to United Arab Emirates."

每个循环有1,000,000个循环和5次重复的时间

timeit -n 1000000 -r 5 re.findall(token_regex, text)
1000000 loops, best of 5: 6.22 us per loop

timeit -n 1000000 -r 5 filter(lambda x: x in text, token_list)
1000000 loops, best of 5: 2.76 us per loop

def somefunc():
    for i in token_list:
        if i in text:
            pass

timeit -n 1000000 -r 5 somefunc()
1000000 loops, best of 5: 1.68 us per loop


t = [hash(x) for x in text.replace('.', '').replace(',','').split()] 
tl = [hash(x) for x in token_list]# this list contains single words, like "New" and "York" but not "New York"

def SomeFunc2():
    for x in tl:
        if x in t:
            pass

timeit -n 1000000 -r 5 SomeFunc2()
1000000 loops, best of 5: 6.26 us per loop

t = set([hash(x) for x in text.replace('.', '').replace(',','').split()])
tl = set(hash(x) for x in token_list])

timeit -n 1000000 -r 5 t.intersection(tl)
1000000 loops, best of 5: 1.75 us per loop

通过使用您的示例数据,循环使用看起来相当快......但正如我所说,您必须使用更多实时数据进行测试。

编辑 :好的,我想使用更多的实时数据更好,所以我使用以下数据集重新计算结果:

list = [u'United Kingdom of Great Britain and Northern Ireland', u'Democratic People\u2019s Republic of Korea', u'Democratic Republic of the Congo', u'Lao People\u2019s Democratic Republic', u'Saint Vincent and the Grenadines', u'United Republic of Tanzania', u'Iran (Islamic Republic of)', u'Central African Republic', u'Islamic Republic of Iran', u'United States of America', u'Bosnia and Herzegovina', u'Libyan Arab Jamahiriya', u'Saint Kitts and Nevis', u'Sao Tome and Principe', u'Syrian Arab Republic', u'United Arab Emirates', u'Antigua and Barbuda', u'Trinidad and Tobago', u'Dominican Republic', u'Russian Federation', u'Brunei Darussalam', u'Equatorial Guinea', u'Republic of Korea', u'Marshall Islands', u'Papua New Guinea', u'Solomon Islands', u'ComodRivadavia', u'Port-au-Prince', u'DumontDUrville', u'Czech Republic', u'United Kingdom', u'Dar es Salaam', u'Cambridge Bay', u'Coral Harbour', u'Port of Spain', u'Santo Domingo', u'St Barthelemy', u'Swift Current', u'Ujung Pandang', u'Yekaterinburg', u'South Georgia', u'C\xf4te d\u2019Ivoire', u"Cote d'Ivoire", u'Guinea-Bissau', u'Liechtenstein', u'United States', u'Johannesburg', u'Buenos Aires', u'Rio Gallegos', u'Blanc-Sablon', u'Campo Grande', u'Danmarkshavn', u'Dawson Creek', u'Indianapolis', u'North Dakota', u'Rankin Inlet', u'Scoresbysund', u'Longyearbyen', u'Kuala Lumpur', u'Antananarivo', u'Port Moresby', u'Burkina Faso', u'Saudi Arabia', u'Sierra Leone', u'South Africa', u'Turkmenistan', u'Addis Ababa', u'Brazzaville', u'Ouagadougou', u'El Salvador', u'Los Angeles', u'Mexico City', u'Pangnirtung', u'Porto Velho', u'Puerto Rico', u'Rainy River', u'Tegucigalpa', u'Thunder Bay', u'Yellowknife', u'Ho Chi Minh', u'Krasnoyarsk', u'Novosibirsk', u'Ulaanbaatar', u'Vladivostok', u'Broken Hill', u'Isle of Man', u'Kaliningrad', u'Guadalcanal', u'Afghanistan', u'Cock Island', u'El Salvador', u'Netherlands', u'New Zealand', u'Philippines', u'Saint Lucia', u'Switzerland', u'Timor-Leste', u'Casablanca', u'Libreville', u'Lubumbashi', u'Nouakchott', u'Porto-Novo', u'Costa Rica', u'Fort Wayne', u'Grand Turk', u'Guadeloupe', u'Hermosillo', u'Petersburg', u'Louisville', u'Monticello', u'Martinique', u'Montevideo', u'Montserrat', u'Paramaribo', u'Porto Acre', u'Rio Branco', u'St Vincent', u'Whitehorse', u'Antarctica', u'South Pole', u'Choibalsan', u'Phnom Penh', u'Ulan Bator', u'Cape Verde', u'Queensland', u'Yancowinna', u'Bratislava', u'Copenhagen', u'Luxembourg', u'San Marino', u'Simferopol', u'Zaporozhye', u'Kiritimati', u'Yugoslavia', u'Azerbaijan', u'Bangladesh', u'Cape Verde', u'Costa Rica', u'Kazakhstan', u'Kyrgyzstan', u'Luxembourg', u'Madagascar', u'Mauritania', u'Micronesia', u'Montenegro', u'Mozambique', u'San Marino', u'Seychelles', u'Tajikistan', u'Uzbekistan', u'Bujumbura', u'Mogadishu', u'Anchorage', u'Araguaina', u'Catamarca', u'Boa Vista', u'Chihuahua', u'Fortaleza', u'Glace Bay', u'Goose Bay', u'Guatemala', u'Guayaquil', u'Tell City', u'Vincennes', u'Menominee', u'Monterrey', u'New Salem', u'Sao Paulo', u'St Thomas', u'Vancouver', u'Ashkhabad', u'Chongqing', u'Chungking', u'Hong Kong', u'Jerusalem', u'Kamchatka', u'Pontianak', u'Pyongyang', u'Qyzylorda', u'Samarkand', u'Singapore', u'Vientiane', u'Jan Mayen', u'Reykjavik', u'St Helena', u'Australia', u'Lord Howe', u'Melbourne', u'Greenwich', u'Amsterdam', u'Bucharest', u'Gibraltar', u'Ljubljana', u'Mariehamn', u'Podgorica', u'Stockholm', u'Volgograd', u'Christmas', u'Kerguelen', u'Mauritius', u'Enderbury', u'Galapagos', u'Kwajalein', u'Marquesas', u'Pago Pago', u'Rarotonga', u'Tongatapu', u'Argentina', u'Australia', u'Guatemala', u'Indonesia', u'Lithuania', u'Mauritius', u'Nicaragua', u'Singapore', u'Sri Lanka', u'Swaziland', u'Macedonia', u'Venezuela', u'Blantyre', u'Djibouti', u'El Aaiun', u'Freetown', u'Gaborone', u'Khartoum', u'Kinshasa', u'Monrovia', u'Ndjamena', u'Sao Tome', u'Timbuktu', u'Windhoek', u'Anguilla', u'La Rioja', u'San Juan', u'San Luis', u'Asuncion', u'Atikokan', u'Barbados', u'Dominica', u'Edmonton', u'Eirunepe', u'Ensenada', u'Kentucky', u'Mazatlan', u'Miquelon', u'Montreal', u'New York', u'Resolute', u'Santiago', u'Shiprock', u'St Johns', u'St Kitts', u'St Lucia', u'Winnipeg', u'Ashgabat', u'Calcutta', u'Damascus', u'Dushanbe', u'Istanbul', u'Jayapura', u'Katmandu', u'Makassar', u'Sakhalin', u'Shanghai', u'Tashkent', u'Tel Aviv', u'Atlantic', u'Adelaide', u'Brisbane', u'Canberra', u'Lindeman', u'Tasmania', u'Victoria', u'Belgrade', u'Brussels', u'Budapest', u'Chisinau', u'Guernsey', u'Helsinki', u'Sarajevo', u'Tiraspol', u'Uzhgorod', u'Auckland', u'Funafuti', u'Honolulu', u'Johnston', u'Pitcairn', u'Barbados', u'Botswana', u'Bulgaria', u'Cambodia', u'Cameroon', u'Colombia', u'Djibouti', u'Dominica', u'Ethiopia', u'Holy See', u'Honduras', u'Kiribati', u'Malaysia', u'Maldives', u'Mongolia', u'Pakistan', u'Paraguay', u'Portugal', u'Slovakia', u'Slovenia', u'Suriname', u'Thailand', u'Tanzania', u'Viet Nam', u'Zimbabwe', u'Anguilla', u'Abidjan', u'Algiers', u'Conakry', u'Kampala', u'Mbabane', u'Nairobi', u'Tripoli', u'America', u'Antigua', u'Cordoba', u'Mendoza', u'Tucuman', u'Ushuaia', u'Caracas', u'Cayenne', u'Chicago', u'Curacao', u'Detroit', u'Godthab', u'Grenada', u'Halifax', u'Indiana', u'Marengo', u'Winamac', u'Iqaluit', u'Managua', u'Marigot', u'Moncton', u'Nipigon', u'Noronha', u'Phoenix', u'Rosario', u'Tijuana', u'Toronto', u'Tortola', u'Yakutat', u'McMurdo', u'Rothera', u'Baghdad', u'Bahrain', u'Bangkok', u'Bishkek', u'Colombo', u'Irkutsk', u'Jakarta', u'Karachi', u'Kashgar', u'Kolkata', u'Kuching', u'Magadan', u'Nicosia', u'Rangoon', u'Tbilisi', u'Thimphu', u'Yakutsk', u'Yerevan', u'Bermuda', u'Madeira', u'Stanley', u'Andorra', u'Belfast', u'Tallinn', u'Vatican', u'Vilnius', u'Mayotte', u'Reunion', u'Chatham', u'Fakaofo', u'Gambier', u'Norfolk', u'Albania', u'Algeria', u'Armenia', u'Austria', u'Bahamas', u'Bahrain', u'Belarus', u'Belgium', u'Bolivia', u'Burundi', u'Comoros', u'Croatia', u'Denmark', u'Ecuador', u'Eritrea', u'Estonia', u'Finland', u'Georgia', u'Germany', u'Grenada', u'Hungary', u'Iceland', u'Ireland', u'Jamaica', u'Lebanon', u'Lesotho', u'Liberia', u'Morocco', u'Myanmar', u'Namibia', u'Nigeria', u'Moldova', u'Romania', u'Senegal', u'Somalia', u'Tunisia', u'Ukraine', u'Uruguay', u'Vanuatu', u'Asmara', u'Asmera', u'Bamako', u'Bangui', u'Banjul', u'Bissau', u'Douala', u'Harare', u'Kigali', u'Luanda', u'Lusaka', u'Malabo', u'Maputo', u'Maseru', u'Niamey', u'Belize', u'Bogota', u'Cancun', u'Cayman', u'Cuiaba', u'Dawson', u'Denver', u'Havana', u'Inuvik', u'Juneau', u'La Paz', u'Maceio', u'Manaus', u'Merida', u'Nassau', u'Recife', u'Regina', u'Virgin', u'Mawson', u'Palmer', u'Vostok', u'Arctic', u'Almaty', u'Anadyr', u'Aqtobe', u'Beirut', u'Brunei', u'Harbin', u'Kuwait', u'Manila', u'Muscat', u'Riyadh', u'Saigon', u'Taipei', u'Tehran', u'Thimbu', u'Urumqi', u'Azores', u'Canary', u'Faeroe', u'Currie', u'Darwin', u'Hobart', u'Sydney', u'Europe', u'Athens', u'Berlin', u'Dublin', u'Jersey', u'Lisbon', u'London', u'Madrid', u'Geneva', u'Monaco', u'Moscow', u'Prague', u'Samara', u'Skopje', u'Tirane', u'Vienna', u'Warsaw', u'Zagreb', u'Zurich', u'Chagos', u'Comoro', u'Easter', u'Kosrae', u'Majuro', u'Midway', u'Noumea', u'Ponape', u'Saipan', u'Tahiti', u'Tarawa', u'Wallis', u'Andora', u'Angola', u'Belize', u'Bhutan', u'Brazil', u'Canada', u'Cyprus', u'France', u'Gambia', u'Greece', u'Guinea', u'Guyana', u'Israel', u'Jordan', u'Kuwait', u'Latvia', u'Malawi', u'Mexico', u'Monaco', u'Norway', u'Panama', u'Poland', u'Rwanda', u'Serbia', u'Sweden', u'Turkey', u'Tuvalu', u'Uganda', u'Zambia', u'Accra', u'Cairo', u'Ceuta', u'Dakar', u'Lagos', u'Tunis', u'Jujuy', u'Aruba', u'Bahia', u'Belem', u'Boise', u'Vevay', u'Thule', u'Casey', u'Davis', u'Syowa', u'Amman', u'Aqtau', u'Dacca', u'Dhaka', u'Dubai', u'Kabul', u'Macao', u'Macau', u'Qatar', u'Seoul', u'Tokyo', u'Faroe', u'Eucla', u'Perth', u'Malta', u'Minsk', u'Paris', u'Sofia', u'Vaduz', u'Cocos', u'Efate', u'Nauru', u'Palau', u'Samoa', u'Benin', u'Chile', u'China', u'Congo', u'Egypt', u'Gabon', u'Ghana', u'Haiti', u'India', u'Italy', u'Japan', u'Kenya', u'Libya', u'Malta', u'Nauru', u'Nepal', u'Niger', u'Palau', u'Qatar', u'Samoa', u'Spain', u'Sudan', u'Syria', u'Tonga', u'Yemen', u'Lome', u'Adak', u'Atka', u'Nuuk', u'Knox', u'Lima', u'Nome', u'Asia', u'Aden', u'Baku', u'Dili', u'Gaza', u'Hovd', u'Omsk', u'Oral', u'Zulu', u'Kiev', u'Oslo', u'Bonn', u'Riga', u'Rome', u'Mahe', u'Apia', u'Fiji', u'Guam', u'Niue', u'Truk', u'Wake', u'Chad', u'Cuba', u'Fiji', u'Iran', u'Iraq', u'Mali', u'Oman', u'Peru', u'Togo', u'GMT', u'Yap']
取自@ hmghaly示例的

列表包含 645 国家和城市

text = "Lorem ipsum dolor Turkey sit amet, Brussels consectetur adipisicing elit, sed do Santo Domingo eiusmod tempor incididunt ut labore Tell City et dolore magna aliqua. Ut Goose Bay enim ad minim veniam, Bahrain quis nostrud exercitation New Salem ullamco laboris nisi Mongolia ut aliquip ex ea Yekaterinburg commodo consequat. Chihuahua Duis aute irure dolor in Nouakchott reprehenderit in voluptate velit Ireland esse cillum dolore eu fugiat nulla Lome pariatur. Excepteur sint occaecat San Marino cupidatat non proident, Comoro sunt in culpa qui officia Belem deserunt mollit anim id est laborum"

文字切片是经典 Lorem ipsum 文字,随机放置国家/城市名称,最终文字是同一文字连续51次的结果,总计 4590 字和 30344 字母。 (这里写的时间太长,因此重复相同的文字)

时间基于1,000(之前我测试过1,000,000个循环)循环,每个循环包含2次重复:

正则表达式

regex = '('+'|'.join(list)+')'
%timeit -n 1000 -r 2 re.findall(regex, text)
1000 loops, best of 2: 3.36 ms per loop

LAMBDA

%timeit -n 1000 -r 2 filter(lambda x: x in text, list)
1000 loops, best of 2: 140 ms per loop

For loop

def somefunc():
    for i in list:
        if i in text:
            pass

%timeit -n 1000 -r 2 somefunc()
1000 loops, best of 2: 138 ms per loop

基数树

from radix_tree import RadixTree
Tokens = list(set(list))

trie = RadixTree()
for token in Tokens:
    trie.insert(token, token)

def FindMatches(trie, text):
    while 0 < len(text):
        try:
            test = text[:text.index(" ")]
        except ValueError:
            test = text

        for token in trie.search_prefix(test, 100):
            if text.startswith(token):
                pass # no need to print to screen

        try:
            text = text[text.index(" ") + 1:]
        except ValueError:
            break # End of string

%timeit -n 1000 -r 2 FindMatches(trie, text)
1000 loops, best of 2: 236 ms per loop

设置和正则表达式

def SomeMoreFunc():
    rgx = '([A-Z][A-Za-z]*)' #@VoronoiPotato's approach
    filtered_text = set(re.findall(rgx, text)) #make a set of all words that starts with a capital letter 
    for x in list:
         #we split city name if it is constucted with 2 or more words, and parse it to a set, then check if all parts of the string are in the filtered text. If yes, then our city is within our text body
        if set(x.split()).issubset(filtered_text):
            pass 

%timeit -n 1000 -r 2 SomeMoreFunc()
1000 loops, best of 2: 2.81 ms per loop

我使用set用法修改了@ VoronoiPotato的方法。


令牌索引

def indexing_list(li):
    index_dict={}
    for i in range(len(li)):
        words=li[i].split()
        for j in range(len(words)):
            index=complex(i,j)
            word=words[j].lower()
            try:
                index_dict[word].append(index)
            except:
                index_dict[word]=[index]
    return index_dict

def someFunc():
    ind_dic = indexing_list(lst)
    text_words=text.split()
    for i in range(len(text_words)):
        tw=text_words[i].lower()
        index_dict.get(tw)


%timeit -n 1000 -r 2 someFunc()
1000 loops, best of 2: 7.41 ms per loop

使用新的数据集,很明显使用正则表达式而不是简单的文本搜索,并且设置用法将提高性能(通过裁剪类似的单词并允许使用issubset来实现更简单,更快速的比较)。基数树搜索在这些方法中给出了最差的结果。对于以前的数据集,正则表达式使用比文本搜索更糟糕......

编辑:附加令牌索引结果。 但是 ,此示例仅搜索单个字词,并且无法控制城市名称中包含两个或更多字词。

,Set&amp; amp;存在危险的错误正则表达式和令牌索引方法,考虑城市名称

El Salvador

以及以下文字:

Salvador Dali lorem ipsum dolor. El Dranges porte quantera. 

这两种方法都会将萨尔瓦多 Salvador El 匹配,因为这些单词和搜索单独搜索。

答案 2 :(得分:4)

使用正则表达式检查文本中的大写单词。这将大大减少花在检查上的时间

[A-Z] [A-Z] *

一旦你得到一个匹配,(一个大写的单词)检查你的列表中的第一个单词是否匹配,如果是,则将下一个匹配与列表中的第二个单词对齐,直到你有一个完全匹配。

答案 3 :(得分:1)

您可能会发现Radix tree效率最高。

基本思想是将搜索到的文本转换为有效查找其他字符串的树。但是,由于您搜索的标记中包含空格,因此您需要这样做。必须做一些摆弄以找出令牌的最佳定义。

例如,每个X字组都是一个标记,其中X是您要搜索的给定项目中的最大字数。示例:&#34;这里的一切都是绿色的。&#34;令牌长度为3个单词将包含&#34;一切都是绿色&#34;,&#34;绿色超过&#34;,&#34;绿色超过此处&#34;。

考虑到问题中的例子(在上面写完之后发布),我最终在上面的代码中颠倒了我在上面建议的内容。被搜索的标记被添加到Trie / Radix树中,然后逐步搜索文本字符串。如果你有更少的令牌和更多的文字要搜索,那么上面的划线可以更有效。

这里是Python implementation of a radix tree,所以你不必自己编写,这是使用该Radix树的实现:

from radix_tree import RadixTree
Tokens = list(set([.....the list in the question.....])) # 'El Salvador' is listed twice, this is to make it unique easily.

trie = RadixTree()
for token in Tokens:
   trie.insert(token, token)

def FindMatches(trie, text):
   while 0 < len(text):
      try:
         test = text[:text.index(" ")]
      except ValueError:
         test = text

      for token in trie.search_prefix(test, 100):
         if text.startswith(token):
            print token

      try:
         text = text[text.index(" ") + 1:]
      except ValueError:
         break # End of string

FindMatches(trie, "I went to New York and New Orleans and London and United States, Canada, and Egypt, Saudi Arabia")

注意:新奥尔良不在代币列表中,而search_prefix内的Trie没有找到加拿大和埃及,因为&#34;,&#34;包含在测试字符串的标记中。

答案 4 :(得分:0)

可能值得尝试在PyPI上使用正则表达式实现,看看它是否更快:

http://pypi.python.org/pypi/regex

我正在考虑“命名列表”功能。

答案 5 :(得分:-1)

无论实际的解析方法如何,由于您的数据太大,您将把它们放在文件中,您可能已经以某种方式进行了这些操作。这是我认为最有效地将数据导入python的方法:

search.txt - 要搜索的字符串,searchterms将是一个字符串列表

large.txt - 要搜索的文字,large将是一个字符串

 with open('search.txt') as x: searchterms = x.readlines()
 with open('large.txt') as x: large = x.read()

我建议你迭代searchterms以找到large中的匹配,正如HussainNagri在回答中所说:

for i in searchterms:
  if i in large:
    print i, " found in text"