Regex, как удалить все не алфавитно-цифровые, кроме двоеточия, в отметке времени 12/24 часа? - PullRequest
4 голосов
/ 17 ноября 2009

У меня есть строка вроде:

Today, 3:30pm - Group Meeting to discuss "big idea"

Как вы строите регулярное выражение таким образом, чтобы после анализа оно возвращало:

Today 3:30pm Group Meeting to discuss big idea

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

Ответы [ 6 ]

8 голосов
/ 17 ноября 2009
# this: D:DD, DD:DDam/pm 12/24 hr
re = r':(?=..(?<!\d:\d\d))|[^a-zA-Z0-9 ](?<!:)'

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

Как это работает

:              // match a colon
(?=..          // match but not capture two chars
  (?<!         // start a negative look-behind group (if it matches, the whole fails)
    \d:\d\d    // time stamp
  )            // end neg. look behind
)              // end non-capture two chars
|              // or
[^a-zA-Z0-9 ]  // match anything not digits or letters
(?<!:)         // that isn't a colon

Тогда применительно к этому глупому тексту:

Today, 3:30pm - Group 1,2,3 Meeting to di4sc::uss3: 2:3:4 "big idea" on 03:33pm or 16:47 is also good

... меняет его на:

Today, 3:30pm  Group 123 Meeting to di4scuss3 234 big idea on 03:33pm or 16:47 is also good
2 голосов
/ 17 ноября 2009

Python.

import string
punct=string.punctuation
s='Today, 3:30pm - Group Meeting:am to discuss "big idea" by our madam'
for item in s.split():
    try:
        t=time.strptime(item,"%H:%M%p")
    except:
        item=''.join([ i for i in item if i not in punct])
    else:
        item=item
    print item,

выход

$ ./python.py
Today 3:30pm  Group Meetingam to discuss big idea by our madam

# change to s='Today, 15:30pm - Group 1,2,3 Meeting to di4sc::uss3: 2:3:4 "big idea" on 03:33pm or 16:47 is also good'

$ ./python.py
Today 15:30pm  Group 123 Meeting to di4scuss3 234 big idea on 03:33pm or 1647 is also good

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

1 голос
/ 17 ноября 2009

Вы можете попробовать, в Javascript:

var re = /(\W+(?!\d{2}[ap]m))/gi;
var input = 'Today, 3:30pm - Group Meeting to discuss "big idea"';
alert(input.replace(re, " "))
1 голос
/ 17 ноября 2009

Полагаю, вы хотели бы также оставить пробелы, и эта реализация на python, но это PCRE, поэтому она должна быть переносимой.

import re
x = u'Today, 3:30pm - Group Meeting to discuss "big idea"'
re.sub(r'[^a-zA-Z0-9: ]', '', x)

Вывод: «Сегодня в 15:30 встреча группы для обсуждения большой идеи»

для более чистого ответа (без пробелов)

import re
x = u'Today, 3:30pm - Group Meeting to discuss "big idea"'
tmp = re.sub(r'[^a-zA-Z0-9: ]', '', x)
re.sub(r'[ ]+', ' ', tmp)

Вывод: «Сегодня в 15:30 встреча группы для обсуждения большой идеи»

0 голосов
/ 03 апреля 2016

Исправьте регулярное выражение, чтобы сделать это:

'(?<!\d):|:(?!\d\d)|[^a-zA-Z0-9 :]'
0 голосов
/ 17 ноября 2009

s = "Позвони мне, моя дорогая, в 3:30"

re.sub (r '[^ \ w:]', '', s)

'Позвони мне, мой дорогой, в 3:30'

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