python regex для даты со словами и цифрами в длинной строке [дубликат]

Зависит от программиста и вашего определения интерактивности.

  1. Синтаксис PHP. Исходя из C ++ с фоном OOP, я изучил синтаксис PHP и что не без ООП через час или около того.
  2. ООП ООП сам взял пару недель. Есть большая книга PHP OOP от David Power, если вам интересно.
  3. Каково ваше определение интерактивного веб-сайта? потрясающий материал? то вы, возможно, захотите узнать javascript / ajax / xml, что не связано с данными? то вам может понадобиться база данных, поэтому вам нужно изучить SQL и базу данных.
  4. Развертывание веб-сайта. Легкий способ: WAMP (окно apache mysql php) / MAMP (mac apache mysql php). У вас будет день на неделю, чтобы научиться общаться с apache и mysql. Трудный путь: LAMP, я взял класс системного администратора как курс для дыхания. Пожимаешь плечами, у тебя больше четверть?

Я думаю, это сводится к вам и как быстро вы учитесь. Голая необходимость для интерактивного веб-сайта для меня - это PHP и база данных (mysql). И с этим вы должны просто начать с книги First First PHP и MySQL от O'Reily. Мне не понравилась эта книга, потому что предполагалось, что вы вообще ничего не знаете о программировании.

10
задан Alan Moore 10 August 2015 в 16:01
поделиться

2 ответа

s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)

Вам не нужно escape дважды, когда вы используете raw mode.

Выход: ['123', '3.1415926']

Также тип возврата будет списком strings .Если вы хотите, чтобы возвращаемый тип, как integers и floats, использовал map

import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))

Выход: [123, 3.1415926]

5
ответ дан vks 16 August 2018 в 11:18
поделиться
  • 1
    Хотя это регулярное выражение менее эффективно, чем мое, я признаю, что трюк с ast является крутым (хотя в OP не требуется). – Wiktor Stribiżew 10 August 2015 в 08:51
  • 2
    @stribizhev я прочитал один из его комментариев .... @stribizhev, it's not, '3.1415926' should be a float number in the result, поэтому я включил это в свой ответ :) – vks 10 August 2015 в 08:53
  • 3
    вы двое оба гения, мне трудно выбрать, какой из них принять. :) – O'Skywalker 10 August 2015 в 08:53
  • 4
    @ O'Skywalker: выберите тот, который работает для вас лучше всего. Просто, пожалуйста, не передумайте завтра, никто из нас не будет рад увидеть -15 очков падения репутации :) – Wiktor Stribiżew 10 August 2015 в 08:55
  • 5
    @ O'Skywalker ничего подобного гения: P .......... просто практика ....... вы скоро станете aficianado !!!!!!!! – vks 10 August 2015 в 08:56

Здесь есть две вещи:

  • re.findall возвращает захваченные тексты, если шаблон регулярного выражения содержит в нем группы захвата
  • часть r'\\.' в вашем шаблон соответствует двум последовательным символам, \ и любому символу, отличному от новой строки.

См. ссылку findall :

Если одна или несколько групп присутствуют в шаблоне, верните список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого совпадения.

Обратите внимание, что чтобы re.findall возвращали только совпадающие значения, вы обычно можете

  • удаляет избыточные группы захвата (например, (a(b)c) -> abc)
  • преобразует все группы захвата в , не захватывая (то есть замените ( на (?:) , если отсутствуют обратные ссылки, которые относятся к значениям группы в шаблоне (см. ниже)
  • вместо re.finditer использовать [x.group() for x in re.finditer(pattern, s)])

В вашем случае findall вернул все захваченные тексты, которые были пустыми, потому что вы \\ в [литерале] строки r'', которые пытались сопоставить литерал \.

Чтобы соответствовать номерам, вам нужно использовать

-?\d*\.?\d+

Регулярное выражение соответствует:

  • -? - Дополнительный знак минус
  • \d* - Необязательные цифры
  • \.? - Дополнительный десятичный разделитель
  • \d+ - 1 или более цифр.

См. demo

Вот демон IDEONE :

import re
s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?\d*\.?\d+'
L = re.findall(pattern, s)
print(L)
8
ответ дан Wiktor Stribiżew 16 August 2018 в 11:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: