正则表达式获取包含字母和(数字/某些特殊)的“单词”,但不仅仅是数字

时间:2017-05-25 18:05:59

标签: python regex

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

使用casepython中尝试此操作到目前为止,作为模式,我有:

re

大部分都有效;但是,我不想要只有数字/特殊的“单词”。例如:

应匹配:

\w*[\d@]\w*

不应该匹配:

h1DF346
123FE453
3f3g6hj7j5v3
hasdf@asdf
r3
r@

排除前两个“不应该匹配”的问题。觉得这里有一些我很想念的东西。谢谢!

4 个答案:

答案 0 :(得分:3)

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

([A-Za-z]+[\d@]+[\w@]*|[\d@]+[A-Za-z]+[\w@]*)

意思是你想要的:

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

Check the regex101 demo here

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

答案 1 :(得分:0)

使用这样的前瞻断言。

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

<强>解释

  • (?=.*[a-zA-Z])测试something or not后跟一个字母。

  • (?=.*[@#\d])测试something or not后面跟着给定字符类中的一个字符。

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

<强> Regex101 Demo

答案 2 :(得分:0)

当你得到答案时,你仍然可以提高接受的正则表达式的速度:

(?=\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@']

劫持@Roberto的演示,你需要一个significant reduction步骤来寻找匹配(&gt; 7000 vs 338,~20次)。

答案 3 :(得分:0)

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

\ W + [\ d @] \ W +

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