Регулярное выражение, соответствующее слову с числами в нем - PullRequest
4 голосов
/ 10 марта 2011

Я использую Text::Ngrams, чтобы определить словосочетания в строке.Однако мне нужно сохранить слова, содержащие цифры.Я определил, что $o->{tokenrex} - это то, что мне нужно изменить, но я не могу определить правильное регулярное выражение для него.

Оригинал - qr/([a-zA-Z]+|(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?)/;, но я думаю, что мне нужно что-то большее построки этого:

 qr/([a-zA-Z]+|(?<=\w)(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?(?=\w)|(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?)/;

Что должно, если я правильно читаю регулярное выражение, соответствовать любому количеству букв алфавита, или «числу», имеющему символ слова до и после него, или «числу»».За исключением того, что оно разделяет мое «слово» на отдельные токены.Вот пример слова, с которым я работаю: « A1X ».

Любая помощь будет отличной.

Ответы [ 4 ]

4 голосов
/ 03 апреля 2011

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

Если вам нужно сопоставить слова, состоящие из букв и цифр, то регулярное выражение для этого будет [a-zA-Z\d]+. В документации по модулю вы также захотите указать, что пропустить, и это соответствует [^a-zA-Z\d]+.

$self->{tokenrex} = qr/([a-z\d]+)/i;
$self->{skiprex}  = qr/([^a-z\d]+)/i;

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

0 голосов
/ 10 марта 2011

Конструкции (?<=...) и (?=...) являются выражениями предварительного просмотра и предварительного просмотра, а соответствующий им текст - , а не , включенный в текст, соответствующий всему регулярному выражению.

В качестве более простого примера, для $_ = "A1X" регулярное выражение

qr/(?<=A)1(?=X)/

соответствует строке $_, но текст соответствует выражению (скажем, в $&) просто 1, а не A1X.

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

qr/([a-zA-Z]+|<B>[a-zA-Z][a-zA-Z0-9]+[a-zA-Z]</B>|(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?)/

(хотя это будет соответствовать A1B2C3D, хотя - не ясноесли хочешь это сделать)

0 голосов
/ 10 марта 2011

Попробуйте это:

qr/(\b[a-zA-Z]([a-zA-Z\d]+[a-zA-Z])?\b|(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?)/

Обратите внимание, однако, что это регулярное выражение (и оригинал) будет соответствовать числам на «краях» слов.

0 голосов
/ 10 марта 2011

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

В любом случае, ваш желаемый шаблон звучит для меня так:

p{L}*(?:\d*\.)?\d+(?:[eE][-+]?\d+)?(?:(?<=p{L}(?:\d*\.)?\d+(?:[eE][-+]?\d+)?)p{L}+)?

Объяснение:

p{L}*                 #Zero or more letter characters (note that this is broader than [a-zA-Z], as it allows accent marks and so forth)
(?:\d*\.)?\d+         #Slightly simplified version of your number-matching pattern
(?:(?<=p{L}...)p{L}+)? #Optionally match trailing letters, but only if there are letters at the beginning

Надеюсь, я понялчто ты ищешь.Одна проблема - [eE];это внесет некоторую двусмысленность.Например, если вы получите строку типа A3E4D , означает ли E букву или показатель степени?У меня есть некоторые идеи по этому поводу, но это будет дольше и сложнее.Дайте мне знать, каковы правила, и я отредактирую, я просто не хочу, чтобы это сбивало с толку, пока я не буду уверен, что вы ищете.

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