Регулярное выражение Python соответствует любому количеству цифр, за которым не следует точка - PullRequest
3 голосов
/ 05 июля 2019

У меня есть список многорядных строк. Я хочу сопоставить первые строки этих строк, если они начинаются с переменного числа цифр, а НЕ сразу после точки.

Например, список может быть

list = ["42. blabla \n foo", "42 blabla \n foo", "422. blabla \n foo"]

и мой желаемый результат будет 42 blabla.

Этот код

import re 

list = ["42. blabla \n foo", "42 blabla \n foo", "422. blabla \n foo"]

regex_header = re.compile("^[0-9]+(?!\.).*\n")

for str in list:
    print(re.findall(regex_header, str))

выходы

['42. blabla \n']
['42 blabla \n']
['422. blabla \n']

Этот работает только с двумя цифрами в начале строки:

import re 

list = ["42. blabla \n foo", "42 blabla \n foo", "422. blabla \n foo"]

regex_header = re.compile("^[0-9]{2}(?!\.).*\n")

for str in list:
    print(re.findall(regex_header, str))

Выход:

[]
['42 blabla \n']
['422. blabla \n']

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Вам нужно (?![.\d]) lookahead:

r"^\d+(?![.\d])"

См. Демоверсию regex . Подробности:

  • ^ - начало строки
  • \d+ - 1+ цифр
  • (?![.\d]) - справа от текущего местоположения не разрешается вводить точки и любые другие цифры.

См. Демоверсию Python :

import re 
l = ["42. blabla \n foo", "42 blabla \n foo", "422. blabla \n foo"]
regex_header = re.compile(r"^[0-9]+(?![.\d])")
for s in l:
    if (regex_header.search(s)):
        print(s)
# => "42 blabla \n foo"
0 голосов
/ 05 июля 2019

Я предполагаю, что, возможно, это то, что мы могли бы вывести:

import re 

list = ["42. blabla \n foo", "42 blabla \n foo", "422. blabla \n foo"]

regex_header = re.compile("^[0-9]+(?!\.)\D*$")

for str in list:
    print(re.findall(regex_header, str))

Демо

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