非连字符的正则表达式匹配 - Python

Posted

技术标签:

【中文标题】非连字符的正则表达式匹配 - Python【英文标题】:Regex Match for Non Hyphenated Words - Python 【发布时间】:2020-03-11 04:50:29 【问题描述】:

我正在尝试在 Python 中为非连字符的单词创建一个正则表达式,但我无法找出正确的语法。

正则表达式的要求是:

    不应包含连字符和 至少应包含 1 个数字

我试过的表达方式是:=

^(?!.*-)

这匹配所有非连字符的单词,但我无法弄清楚如何额外添加第二个条件。

^(?!.*-(?=/d1,))

我尝试使用双重前瞻,但不确定要使用的语法。这匹配 ID101 但也匹配 ***

应该匹配的示例词: 1DRIVE , ID100 , W1RELESS

不应该匹配的示例词: 基本上是任何非数字字符串(如 STACK、OVERFLOW)或任何连字符(Test-11、24-hours)

附加信息:

我正在使用库 re 并编译正则表达式模式并使用 re.search 进行匹配。

任何帮助都会非常有帮助,因为我是正则表达式匹配的新手,并且在这方面停留了好几个小时。

【问题讨论】:

这是在一个字符串中查找多个还是验证单个“单词”输入? that 为您工作吗? @ctwheels 在我对输入进行标记并删除干扰词之后,它正在搜索一个单词。 Toto、Paul 和 Emma 的所有解决方案都非常适合我的要求!我只能选择一个作为答案。谢谢你们三个! 【参考方案1】:

也许,

(?!.*-)(?=.*\d)^.+$

可能工作正常。

测试

import re

string = '''
abc
abc1-
abc1
abc-abc1
'''

expression = r'(?m)(?!.*-)(?=.*\d)^.+$'


print(re.findall(expression, string))

输出

['abc1']

如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。


正则表达式电路

jex.im 可视化正则表达式:

正则表达式 101 解释

/
(?!.*-)(?=.*\d)^.+$
/
gm

Negative Lookahead (?!.*-)
Assert that the Regex below does not match
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
- matches the character - literally (case sensitive)
Positive Lookahead (?=.*\d)
Assert that the Regex below matches
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\d matches a digit (equal to [0-9])
^ asserts position at start of a line
.+ matches any character (except for line terminators)
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
$ asserts position at the end of a line
Global pattern flags
g modifier: global. All matches (don't return after first match)
m modifier: multi line. Causes ^ and $ to match the begin/end of each line (not only begin/end of string)

【讨论】:

你能解释一下吗? 谢谢!它有帮助。【参考方案2】:

我想出了-

^[^-]*\d[^-]*$

    所以我们至少需要一位 (\d) 我们需要字符串的其余部分包含除 - ([^-]) 以外的任何内容 我们可以有无限数量的这些字符,所以[^-]* 但是将它们像[^-]*\d 一样放在一起会在aaa3- 上失败,因为- 出现在有效匹配之后- 让我们确保在我们的匹配之前或之后没有破折号可以潜入^[-]*\d$

    不幸的是,这意味着aaa555D 失败。所以我们实际上需要再次添加第一组 - ^[^-]*\d[^-]$ --- 表示开始 - 任意数量的不是破折号的字符 - 一个数字 - 任意数量的不是破折号的字符 - 结束

    根据风格,我们也可以使用^([^-]*\d)+$,因为数字/数字的顺序无关紧要,我们可以拥有任意数量的。

然而,最后......这就是我实际解决这个特定问题的方法,因为正则表达式可能很强大,但它们往往会使代码更难理解......

if ("-" not in text) and re.search("\d", text):

【讨论】:

以上是关于非连字符的正则表达式匹配 - Python的主要内容,如果未能解决你的问题,请参考以下文章

python 正则表达式

python正则表达式

正则表达式---python

python正则表达式

python正则表达式及RE模块

python正则表达式及RE模块