Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python regex将获得;字;包含字母和(数字/某些特殊),但不限于数字_Python_Regex - Fatal编程技术网

Python regex将获得;字;包含字母和(数字/某些特殊),但不限于数字

Python regex将获得;字;包含字母和(数字/某些特殊),但不限于数字,python,regex,Python,Regex,简而言之:我想匹配任何包含1个字母和至少1个(数字/某些特殊字符)的“单词”(由空格分隔的连续字符集)。这些“词”可以出现在句子的任何地方 在python中尝试使用re到目前为止,作为一种模式,我有: \w*[\d@]\w* 这在很大程度上是可行的;然而,我不想让“文字”仅仅是数字/特殊。例: 应匹配: h1DF346 123FE453 3f3g6hj7j5v3 hasdf@asdf r3 r@ 不应匹配: 555555 @ hello onlyletters 无法排除“不应匹配”下的前两个

简而言之:我想匹配任何包含1个字母和至少1个(数字/某些特殊字符)的“单词”(由空格分隔的连续字符集)。这些“词”可以出现在句子的任何地方

python
中尝试使用
re
到目前为止,作为一种模式,我有:

\w*[\d@]\w*

这在很大程度上是可行的;然而,我不想让“文字”仅仅是数字/特殊。例:

应匹配:

h1DF346
123FE453
3f3g6hj7j5v3
hasdf@asdf
r3
r@
不应匹配:

555555
@
hello
onlyletters

无法排除“不应匹配”下的前两个。感觉这里有些简单的东西我错过了。谢谢

我会使用
|
或这样的运算符:

([A-Za-z]+[\d@]+[\w@]*|[\d@]+[A-Za-z]+[\w@]*)
意思是你想要:

  • 字母后接数字@后接任意组合
  • 或数字@后跟字母,后跟任意组合


如果在正则表达式的其他部分中使用组,请考虑使用非捕获组
(?:…)
,而不是
(…)

使用类似的前瞻断言

正则表达式:
(?=.*[a-zA-Z])(?=.[@#\d])[a-zA-Z\d@+

说明:

  • (?=.*[a-zA-Z])
    测试
    某物是否后跟一个字母

  • (?=.[@#;\d])
    测试
    某物是否后跟给定字符类中的一个字符

  • [a-zA-Z\d@#]+
    匹配给定字符类中的一个或多个字符


虽然您有了答案,但仍然可以提高已接受正则表达式的速度:

(?=\d++[A-Za-z]+[\w@]+|[a-zA-Z]++[\w@]+)[\w@]{2,}
您需要更新的
regex
模块:

import regex as re

string = "h1DF346 123FE453 3f3g6hj7j5v3 hasdf@asdf r3 r@ 555555 @ hello onlyletters"
rx = re.compile(r'(?=\d++[A-Za-z]+[\w@]+|[a-zA-Z]++[\w@]+)[\w@]{2,}')
print(rx.findall(string))
# ['h1DF346', '123FE453', '3f3g6hj7j5v3', 'hasdf@asdf', 'r3', 'r@']

Highjacking@Roberto的演示,您将有一个查找匹配项所需的步骤(>7000对338,~20次)。

如果您仅将*(匹配项0或更多)更改为+(匹配项1或更多),您可以正确命中所有内容

\w+[\d@]\w+


除了5555。。。字母和数字的分布是否还有其他模式可以区分?你能用[\d@]之前或之后至少一个字母的要求替换\w来处理它吗?

当你说“word”(连续字符集)并使用
\w
时,它也将包含数字。As
\w
代表
[a-zA-Z0-9\
。还要澄清哪些特殊字符?例如,我发布的模式中的@。至少应该有1个字母,和(1个数字或1@#)-为了简单起见,我刚刚在这里添加了@示例-我不知道我还需要哪些字母,但是看到带@的模式就足够了。这些“单词”是一行中唯一的东西,或者它们可以出现在任何地方?可以出现在行中的任何地方。比如:“你好,123测试世界”应该是123测试感兴趣的!以前从未听说过跳过/失败,并且肯定希望对此进行更多研究。但是,此示例似乎也匹配任何以大写字母开头的单词,它将匹配不应匹配的“@@@”t@NikT:调整后,它不再是了(在你原来的帖子中这仍然不是要求)。给定“NikT”匹配“ikT”,这不应该:PIt匹配“123@”,这不应该;)它不会匹配“r@”,而“r@”应该匹配。它比Rahul的答案需要更少的步骤,而比@Jan的答案需要更多的步骤,因为它不起作用:P@Jan仍然失败:给定的“Jan”匹配不应该匹配的“an;”@Jan匹配的是“123@”,它不应该:)如果能比我的答案提高10倍,我会非常惊讶(并且渴望知道如何做到),因为or'ed正则表达式在第一个字符上应该失败……imo的解决方案是使第一个替代项具有占有性,请参阅此示例,该示例匹配所有所需单词,但保留其余单词(需要338个步骤):