2014-10-24 4 views
1

Чтобы лучше очистить мой форум сообщение Corpus, я хотел бы, чтобы удалить начальные пробелы перед тем пунктуации и добавьте один после при необходимости, с помощью двух регулярных выражений. Последнее не было проблемой ((?<=[.,!?()])(?!)), но у меня есть некоторые проблемы с первым, по крайней мере.Regex ведущее пространство/добавить отставая пробел перед/пунктуации

Я использовал это выражение: \s([?.!,;:"](?:\s|$))

Но это далеко не достаточно гибко:

  • Это соответствует, даже если уже есть пространство (или более) до знака препинания
  • Безразлично» t, если после символа пунктуации нет пробела
  • Он не соответствует любому символу пунктуации (но я думаю, что могу использовать [:punct:] для этого, в конце дня)

Наконец, и соответствует десятичной точки (в то время как они не должны)

Как я могу в конечном счете переписать выражение для удовлетворения моих потребностей?

Пример Строки и ожидаемый выход

This is the end .Hello world! # This is the end. Hello world! (remove the leading, add the trailing) 
This is the end, Hello world! # This is the end, Hello world! (ok!) 
This is the end . Hello world! # This is the end. Hello world! (remove the leading, ok the trailing) 
This is a .15mm tube # This is a .15 mm tube (ok since it's a decimal point) 
+0

примера будет лучше. –

+0

Вы пытаетесь сопоставить строки или удалить пробелы? –

+0

@AvinashRaj Я добавил несколько примеров и лучшее разъяснение (обоих) моих потребностей :) –

ответ

2

Используйте \p{P} для соответствия всем пунктам. Используйте \h* вместо \s*, потому что \s будет соответствовать символам новой строки.

(?<!\d)\h*(\p{P}+)\h*(?!\d) 

Заменить совпавшие строки по \1<space>

DEMO

> x <- c('This is the end .Stuff', 'This is the end, Stuff', 'This is the end . Stuff', 'This is a .15mm tube') 
> gsub("(?<!\\d)\\h*(\\p{P}+)\\h*(?!\\d)", "\\1 ", x, perl=T) 
[1] "This is the end. Stuff" "This is the end, Stuff" "This is the end. Stuff" 
[4] "This is a .15mm tube" 
+0

@GabrieleB это работает для меня. См. Обновление. –

+0

очень элегантно, работает плавно, и это почти * идеально! Единственными глюками являются открытый parhentesis (который на западных языках имеет обратное поведение - он стежка к завершающему слову, а не предшествующему) и hypen (который не должен совпадать, если внутри слова, например «бычья голова»). Кроме того, это идеально! –

+0

Как насчет этого http://regex101.com/r/kP4pZ2/24? –

1

Вот выражение, которое обнаруживает подстроки, которые должны быть заменены:

\s*\.\s*(?!\d) 

Вы должны заменить их на: . (точка и пробел)

Настоящая демонстрационная ссылка о том, как это работает: http://regex101.com/r/zB2bY3/1

Объяснения регулярного выражения:

  • \s* - соответствует пустому пространству, любое количество символов (0 - неограниченное)
  • \. - соответствует точке
  • \s* - такой же, как и выше
  • (?!\d) - отрицательный предпросмотр , Это означает, что строка, для которой требуется совпадение, не должна сопровождаться цифрой (это обрабатывает ваш последний тестовый пример).
+0

tnx @ w0lf, он почти работает. Но подстановка только для определенного символа (точки), в то время как мне нужно сопоставить весь класс [: punct:]. Кроме того, если есть несколько последовательных символов пунктуации. Например, «Когда-то ...» или «(как я уже говорил!) –

Смежные вопросы