Как заменить на целочисленную переменную как часть шаблона поиска - PullRequest
2 голосов
/ 09 мая 2019

Я пытаюсь заменить некоторый текст-заполнитель в файле содержимым списка, который я создал.Я перебираю список, считая на ходу, и делаю поиск, который меняется в зависимости от количества.Счетчик - это целое число, которое является частью поискового запроса, который я использую в каждом цикле.

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

Образец текста из файла get загружается в переменную 'filedata':

<core:para>ANSWER_1</core:para><core:para>2. Bilateral investment treaties</core:para><core:para>ANSWER_2</core:para><core:para>3. Domestic arbitration law</core:para><p>ANSWER_3</p><core:para>4. Domestic arbitration and UNCITRAL</core:para><core:para>ANSWER_4</core:para><core:para>5. Mandatory provisions</core:para><core:para>ANSWER_5</core:para><core:para>6. Substantive law</core:para><core:para>ANSWER_6</core:para><core:para>7. Arbitral institutions</core:para><core:para>ANSWER_7</core:para><core:para>8. Arbitrability</core:para><core:para>ANSWER_8</core:para><core:para>9. Requirements</core:para><core:para>ANSWER_9</core:para><core:para>10. Enforceability</core:para><core:para>ANSWER_10</core:para>

Код:

x = 1            
answerlist = ['Oranges', 'Apples', 'Mangos', 'Cherries']

for a in answerlist:
    searchterm = '<core:para>ANSWER_' + str(x) +'</core:para>'
    newdata = filedata.replace(searchterm, a)
    x=x+1

Для целейВ приведенном выше примере я жестко закодировал переменную answerlist, но она динамически создается в большом цикле.

Ожидаемый результат:

<core:para>Oranges</core:para><core:para>2. Bilateral investment treaties</core:para><core:para>Apples</core:para> и т. Д.

Фактический результат:

<core:para>ANSWER_1</core:para><core:para>2. Bilateral investment treaties</core:para><core:para>ANSWER_2</core:para>

У меня естьпроверил шаблон по обе стороны от x, и это прекрасно работает, поэтому проблема, похоже, в x, почему-то не преобразующемся в строку, я думаю, что это так.

Есть идеи, в чем может быть проблема?

Ответы [ 3 ]

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

Вот что работает, похоже, это был обратный слеш в закрывающем теге.

x = 1            
answerlist = ['Oranges', 'Apples', 'Mangos', 'Cherries']

for a in answerlist:
    searchterm = '<core:para>ANSWER_' + str(x) + r'</core:para>'
    newdata = filedata.replace(searchterm, a)
    x=x+1

Обратите внимание на букву «r» перед последней строкой шаблона в конструкции переменной searchterm, которая превращает строку в необработанную, без необходимости в escape-символах.

0 голосов
/ 09 мая 2019

Может потребоваться сначала захватить их, а затем заменить их на нужные числа, используя простой цикл for и замену строки.

Это выражение может помочь вам захватить нужные номера с помощью группы захвата ([0-9]+):

(<core:para>ANSWER_)([0-9]+)(<\/core:para>)

enter image description here

Тест на Python

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(<core:para>ANSWER_)([0-9]+)(<\/core:para>)"

test_str = "<core:para>ANSWER_4</core:para><core:para>5. Mandatory provisions</core:para><core:para>ANSWER_5</core:para><core:para>6. Substantive law</core:para><core:para>ANSWER_6</core:para><core:para>7. Arbitral institutions</core:para><core:para>ANSWER_7</core:para><core:para>8. Arbitrability</core:para><core:para>ANSWER_8</core:para><core:para>9. Requirements</core:para><core:para>ANSWER_9</core:para><core:para>10. Enforceability</core:para><core:para>ANSWER_10</core:para><core:para>11. Third parties - bound by arbitration agreement</core:para><core:para>ANSWER_11</core:para><core:para>12. Third parties - participation</core:para><core:para>ANSWER_12</core:para><core:para>13. Groups of companies</core:para><core:para>ANSWER_13</core:para><core:para>14. Multiparty arbitration agreements</core:para><core:para>ANSWER_14</core:para><core:para>15. Eligibility of arbitrators</core:para><core:para>ANSWER_15</core:para><core:para>16. Background of arbitrators</core:para><core:para>ANSWER_16</core:para>"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Тест на JavaScript

const regex = /(<core:para>ANSWER_)([0-9]+)(<\/core:para>)/gm;
const str = `<core:para>ANSWER_4</core:para><core:para>5. Mandatory provisions</core:para><core:para>ANSWER_5</core:para><core:para>6. Substantive law</core:para><core:para>ANSWER_6</core:para><core:para>7. Arbitral institutions</core:para><core:para>ANSWER_7</core:para><core:para>8. Arbitrability</core:para><core:para>ANSWER_8</core:para><core:para>9. Requirements</core:para><core:para>ANSWER_9</core:para><core:para>10. Enforceability</core:para><core:para>ANSWER_10</core:para><core:para>11. Third parties - bound by arbitration agreement</core:para><core:para>ANSWER_11</core:para><core:para>12. Third parties - participation</core:para><core:para>ANSWER_12</core:para><core:para>13. Groups of companies</core:para><core:para>ANSWER_13</core:para><core:para>14. Multiparty arbitration agreements</core:para><core:para>ANSWER_14</core:para><core:para>15. Eligibility of arbitrators</core:para><core:para>ANSWER_15</core:para><core:para>16. Background of arbitrators</core:para><core:para>ANSWER_16</core:para>`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

График

Этот график показывает, как будет работать выражение, и вы можете визуализировать другие выражения в этой ссылке :

enter image description here

Тест производительности

Этот фрагмент JavaScript показывает производительность этого выражения с использованием простого цикла for в миллион раз.

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const string = '<core:para>ANSWER_4</core:para>';
	const regex = /(<core:para>ANSWER_)([0-9]+)(<\/core:para>)/gm;
	var match = string.replace(regex, "$2");
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ??? ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");
0 голосов
/ 09 мая 2019

Я собираюсь сделать предположение о том, что вы пытаетесь сделать здесь. Я взял ваш пример текста сверху и присвоил ему строку txt в коде ниже. Я могу использовать re.split вместе с группировками (в скобках), чтобы получить число, которое я ищу, чтобы создать список. Затем я могу перебрать все остальные элементы в списке, вывести интересующее меня целое число и переназначить это значение в списке для моей замены. В этом случае я просто заменяю на основе заглавного алфавита, но вы можете разместить здесь любой список, который вы хотите

txt="""<core:para>ANSWER_4</core:para><core:para>5. Mandatory provisions</core:para><core:para>ANSWER_5</core:para><core:para>6. Substantive law</core:para><core:para>ANSWER_6</core:para><core:para>7. Arbitral institutions</core:para><core:para>ANSWER_7</core:para><core:para>8. Arbitrability</core:para><core:para>ANSWER_8</core:para><core:para>9. Requirements</core:para><core:para>ANSWER_9</core:para><core:para>10. Enforceability</core:para><core:para>ANSWER_10</core:para><core:para>11. Third parties - bound by arbitration agreement</core:para><core:para>ANSWER_11</core:para><core:para>12. Third parties - participation</core:para><core:para>ANSWER_12</core:para><core:para>13. Groups of companies</core:para><core:para>ANSWER_13</core:para><core:para>14. Multiparty arbitration agreements</core:para><core:para>ANSWER_14</core:para><core:para>15. Eligibility of arbitrators</core:para><core:para>ANSWER_15</core:para><core:para>16. Background of arbitrators</core:para><core:para>ANSWER_16</core:para>"""
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
pieces = re.split(r'<core:para>ANSWER_([0-9]+)</core:para>', txt)
for i in range(1, len(pieces), 2):
    idx = int(pieces[i])
    pieces[i] = f'A CAPITAL LETTER: {alphabet[idx]}'
print(''.join(pieces))

Это распечатает:

ПИСЬМО КАПИТАЛА: E5. Обязательные положения ПИСЬМО КАПИТАЛА: F6. Материальное право ПИСЬМО КАПИТАЛА: G7. Арбитражное учреждение КАПИТАЛЬНОЕ ПИСЬМО: H8. Арбитражность ПИСЬМО КАПИТАЛА: I9. Требования ПИСЬМО КАПИТАЛА: J10. ИСПОЛНИТЕЛЬНОЕ ПИСЬМО КАПИТАЛА: K11. Третьи лица - связаны арбитражным соглашением. КАПИТАЛЬНОЕ ПИСЬМО: L12. Третьи лица - участие ПИСЬМО КАПИТАЛА: M13. Группы компаний КАПИТАЛЬНОЕ ПИСЬМО: N14. Многопартийные арбитражные соглашения ПИСЬМО КАПИТАЛА: O15. Приемлемость арбитров КАПИТАЛЬНОЕ ПИСЬМО: P16. Предыстория арбитров КАПИТАЛЬНОЕ ПИСЬМО: Q

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