Expression régulière correspondant à un mot avec les numéros de il
Je suis en utilisant Text::Ngrams
afin de déterminer les combinaisons de mots dans une chaîne de caractères. Cependant, j'ai besoin de garder les mots ont des chiffres en eux. J'ai déterminé que $o->{tokenrex}
est ce que je dois modifier, mais je ne peux pas déterminer la bonne regex.
L'original est qr/([a-zA-Z]+|(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?)/;
mais je pense que j'ai besoin de quelque chose de plus le long des lignes de cette:
qr/([a-zA-Z]+|(?<=\w)(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?(?=\w)|(\d+(\.\d+)?|\d*\.\d+)([eE][-+]?\d+)?)/;
Qui devrait, si je suis en train de lire regex droit, correspond à un nombre quelconque de caractères alpha, ou un "nombre" qui a un caractère de mot avant et après, ou un "numéro". Sauf que c'est de la séparation de mon "mot" pour séparer les jetons. L'exemple de mot je travaille est "A1X".
Toute aide serait super.
x
regex modificateur qui vous permet d'utiliser des espaces blancs (espaces, tabulations, retours à la ligne) dans l'expression rationnelle pour la mise en formeStrom j'ai pleinement l'intention; je préfère avoir de travail avant que j'essaie d'expliquer ce qu'il fait 🙂
C'est juste le point. Il est plus facile d'obtenir ce travail si vous pouvez voir ce que ça donne!
OriginalL'auteur Glen Solsberry | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
Y'all sont la prise de cette façon, trop compliqué. L'original de l'expression régulière correspond à des mots composés de lettres seulement ou des nombres (entiers, flottants moment, y compris la notation exponentielle).
Si vous avez besoin de faire correspondre des mots composés de lettres et de chiffres, puis le regex pour qui est
[a-zA-Z\d]+
. Par le module de docs, vous aurez également besoin de spécifier les éléments à ignorer, et qui correspond à[^a-zA-Z\d]+
.Si vous avez besoin de reconnaître les chiffres que la documentation du module montre dans son exemple, alors s'il vous plaît laissez-moi savoir et je serai heureux d'ajouter que, de retour pour vous. À partir de votre description, cela ne ressemble pas à ce que vous avez besoin.
OriginalL'auteur unpythonic
La
(?<=...)
et(?=...)
constructions sont look-derrière et regarde en avant les expressions, et le texte qu'ils correspondent sont pas inclus dans le texte correspondant à l'ensemble de l'expression régulière.Comme un exemple simple, pour
$_ = "A1X"
, l'expression régulièrecorrespond à la chaîne de
$_
, mais le texte correspondant à l'expression (par exemple, dans$&
) est juste1
, pasA1X
.Vous pouvez ajouter une autre clause à l'expression originale:
(ce qui correspondra à
A1B2C3D
s'il n'est pas clair si vous voulez à faire)OriginalL'auteur mob
Donc, on dirait que vous avez un couple de choses que vous êtes à la recherche à résoudre. Le problème avec le fractionnement de la parole dans les différents jetons est assez facile, si je comprends ce que tu veux dire par là: il suffit d'utiliser non-capture de groupes. Utilisation
(?:foo)
si vous ne voulez pas créer un nouveau groupe de capture autour defoo
; utilisation(foo)
si vous n'.De toute façon, ce que votre motif souhaité sons comme pour moi, c'est ceci:
Explication:
Espère que j'ai compris ce que vous cherchez. Un problème est la
[eE]
; d'introduire une certaine ambiguïté. Par exemple, si vous obtenez une chaîne comme A3E4D, est le E signifie qu'une lettre, ou un exposant? J'ai quelques idées à ce sujet, mais il sera plus long et plus compliqué. Permettez-moi de savoir quelles sont les règles et je vais modifier, je ne veux pas faire cette confusion jusqu'à ce que je suis sûr de ce que vous cherchez.Ah, c'est dommage. Il est tout de même faisable, il va juste être plus. Essayez ceci:
p{L}+(?:\d*\.)?\d+(?:[eE][-+]?\d+)?p{L}+|(?<!p{L})(?:\d*\.)?\d+(?:[eE][-+]?\d+)?(?!p{L})
Devrait faire essentiellement la même chose.OriginalL'auteur Justin Morgan
Essayez celui-ci:
Noter, cependant, que cette expression (et d'origine) va correspondre à des numéros sur les "bords" de mots.
OriginalL'auteur ridgerunner