У меня была аналогичная проблема, но мне пришлось заменить массив терминов. Все решения, которые я нашел, не сработали, если два слова находились в тексте рядом друг с другом (поскольку их границы перекрывались). Поэтому мне пришлось использовать небольшой модифицированный подход:
var text = "Ještě. že; \"už\" à. Fürs, 'anlässlich' že že že.";
var terms = ["à","anlässlich","Fürs","už","Ještě", "že"];
var replaced = [];
var order = 0;
for (i = 0; i < terms.length; i++) {
terms[i] = "(^\|[ \n\r\t.,;'\"\+!?-])(" + terms[i] + ")([ \n\r\t.,;'\"\+!?-]+\|$)";
}
var re = new RegExp(terms.join("|"), "");
while (true) {
var replacedString = "";
text = text.replace(re, function replacer(match){
var beginning = match.match("^[ \n\r\t.,;'\"\+!?-]+");
if (beginning == null) beginning = "";
var ending = match.match("[ \n\r\t.,;'\"\+!?-]+$");
if (ending == null) ending = "";
replacedString = match.replace(beginning,"");
replacedString = replacedString.replace(ending,"");
replaced.push(replacedString);
return beginning+"{{"+order+"}}"+ending;
});
if (replacedString == "") break;
order += 1;
}
См. Код в скрипке: http://jsfiddle.net/antoninslejska/bvbLpdos/1/
Регулярное выражение вдохновлено: http://breakthebit.org/post/3446894238/word-boundaries-in-javascripts-regular
Я могу " t сказать, что я нахожу решение элегантным ...
Вы можете использовать
\([a-z]\)\s+([a-z]+)(?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important)
См. Демонстрацию regex
Подробности
\([a-z]\)
- строчная буква внутри скобок \s+
- 1+ пробелы ([a-z]+)
- Группа 1: одна или несколько строчных букв внутри скобок (?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important)
- a положительный прогноз, соответствующий местоположению, за которым сразу следует (?:\s*,\s*\([a-z]\)\s+[a-z]+)*
- 0 или более повторений \s*,\s*
- запятой, заключенной в 0+ пробелов li> \s+
- 1+ пробелы li> [a-z]+
- 1+ строчные буквы li> ul> \s*,\s*
- запятая, заключенная в 0+ пробелов \([a-z]\)
- строчная буква внутри скобок \s+
- 1+ пробелов important
- a слово. import re
strs = ["(a) first, (b) second, (c) important", "(a) aa, (b) cc, (c) dd, (d) oi, (e) important", "(a) aa, (b) asdf, (c) wer" ]
r = re.compile(r'\([a-z]\)\s+([a-z]+)(?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important)')
for s in strs:
print(r.findall(s))
Вывод:
['first', 'second']
['aa', 'cc', 'dd', 'oi']
[]