RegEx, чтобы найти звездочку (только если не в окружении цифр) - PullRequest
1 голос
/ 18 января 2020

Я ищу выражение Regex, которое возвращает совпадение, если выполнено любое из следующих условий:

  • Обнаружена звездочка, которая не находится в середине двух чисел. Первое число всегда будет целым числом, но второе число может быть целым числом (1 * 4), float (8 * 1,35) или scientifi c (8 * 2e-3)
  • Любые текстовые строки (опять же, игнорируя обозначения scientifi c)

Примечание: я построил выражение для удаления любого текста, который следует за двойной звездочкой ("**"), но был бы признателен, если бы решение могло также включить это как один шаг. В конце концов я разделю строку по значениям в ней, но завис на начальном шаге «has_text» (помечая строки звездочкой, но игнорируя, когда это происходит между 2 числами):

Пример ввода :

input = ["1 2 3",
         "4 5 6 **This is a comment to strip",
         "123 *This is a line to ignore 321",
         "7e-1 3*8 9"]

Желаемый выход:

output = ["1 2 3",
          "4 5 6",
          "7e-1 3*8 9"]

Код:

import re
output = []
for line in input:
    line_no_comments = re.sub('(\*{2}.*)', '', line)
    has_text = re.search('([^0-9eE .-]+[*]{1})', line_no_comments)
    if not has_text:
        output.append(line_no_comments)

Ответы [ 2 ]

1 голос
/ 18 января 2020

Вы можете использовать понимание вложенного списка, чтобы решить эту проблему - первым шагом является удаление комментариев (все, включая и после **), а затем удаление любой строки, у которой * предшествует или сопровождается не di git:

output = [x for x in [re.sub(r'\s*\*\*.*$', '', y) for y in input] if not re.search(r'(^|\D)\*|\*(\D|$)', x)]
print(output)

Вывод (для ваших данных выборки)

['4 5 6', '1 2 3 4', '7e-1 3*8 9']
1 голос
/ 18 января 2020

Требуемое регулярное выражение должно учитывать четыре случая:

  1. Начиная с числа, необязательного пробела и нет di git после *
  2. Начиная с *
  3. Соответствует любому * без ди git перед ним
  4. Соответствует любому * без ди git позади него

Тогда вы просто сопоставляете что-либо после того, как соответствует *

Используйте следующее регулярное выражение, и replace совпадения с blank

((^(\d+)\s?\*\D)|(^\*)|(\*(?=\D))|(\*\D)).*

Рассмотрим следующие элементы в списке:

*1 2 3 This is a comment
1 *This is a comment
4 5 6 **This is a comment to strip
1 2 3 4
123 *This is a line to ignore 321
7e-1 3*8 9

Следующие строки - это то, что выделит регулярное выражение:

*1 2 3 This is a comment
1 *This is a comment
**This is a comment to strip
123 *This is a line to ignore 321
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...