2016-09-19 2 views
2

Я следующая строкаPython Regex удалить номера и номера с punctaution

line = "1234567 7852853427.111 https://en.wikipedia.org/wiki/Dictionary_(disambiguation)" 

Я хотел бы, чтобы удалить номера 1234567 +7852853427,111 с использованием регулярных expresisions

Я это снова nline = re.sub («^ \ d + \ s | \ s \ d + \ s | \ s \ d \ w \ d \ \ s \ d + $", "", строка)

но это не делает то, что я надеялся, что это будет делает.

Может ли кто-нибудь указать мне правильное направление?

+1

Несколько сыпучих замечаний по * почему * вашей попытке не получилась: начало анкер кажется правильным, но этого конца якоря нет. На самом деле это не конец строки! Кроме того, ** все ** этих '|' разделяли все регулярное выражение на отдельные части, т. Е. Первая часть соответствует началу строки, а вторая - нет. Вы можете прочитать о создании групп с круглыми скобками. – usr2564301

+0

Откуда взялась эта строка? Разбор HTML? .. – alecxe

+1

Большинство текущих предложений более или менее убивают каждую последовательность цифр внутри строки. Можете ли вы быть уверены, что никогда не будет цифр в той части, которую вы хотите сохранить? Как насчет удаления «первых двух слов»? Или «все до' http: // '"? В вашем названии упоминается * пунктуация * - следует ли «1..2» в начале удалить? – usr2564301

ответ

2

Вы можете использовать:

>>> line = "1234567 7852853427.111 https://en.wikipedia.org/wiki/Dictionary_(disambiguation)" 
>>> print re.sub(r'\b\d+(?:\.\d+)?\s+', '', line) 

https://en.wikipedia.org/wiki/Dictionary_(disambiguation) 

Regex \b\d+(?:\.\d+)?\s+ будет соответствовать целое или десятичное число с последующим 1 или более пробелов. \b для границы слова.

+0

Якорь в начале будет немного безопаснее :) – usr2564301

+1

'\ b' будет работать, но'^'не будет, потому что' 7852853427.111' не на старте. – anubhava

+0

Ах, потому что вы рассматриваете каждый номер отдельно. Мне было интересно, почему - возможно, OP нуждается в разъяснении или добавлении нескольких примеров. Я действительно думал о чем-то столь же прямолинейном, как '^ [\ d. \ S] +' ... – usr2564301

1

Вот не-регулярное выражение подход, если ваше требование регулярное выражение не совсем строгое, используя itertools.dropwhile:

>>> ''.join(dropwhile(lambda x: not x.isalpha(), line)) 
'https://en.wikipedia.org/wiki/Dictionary_(disambiguation)' 
0

Я думаю, что это то, что вы хотите:

nline = re.sub("\d+\s\d+\.\d+", "", line) 

Он удаляет числа из линия. Если вы хотите сохранить пространство перед «http ...», ваш второй параметр должен, конечно, быть «».

Если вы хотите записать отдельные строки чисел можно поместить их в группы, как это:

>>> result = re.search("(\d+)\s(\d+\.\d+)", line) 
>>> print(result.group(0)) 
1234567 7852853427.111 
>>> print(result.group(1)) 
1234567 
>>> print(result.group(2)) 
7852853427.111 

Отличный способ узнать и на практике регулярных выражений regex101.

0

Хотя вы запрашиваете регулярное выражение, лучшим решением было бы использовать str.split, предполагая, что ваша строка всегда будет в формате {number} {number} {hyperlink}.

Как @godaygo said, вы можете использовать это:

line = line.split()[-1] 

строка будет разделена на пробельных, и мы выбираем последнюю подстроку.

Если вы хотите, чтобы доступ ко всем частям (при условии, что всегда есть три), вы можете использовать вместо этого:

num1, num2, url = line.split() 
Смежные вопросы