Python 如何使用正则表达式在字符串中搜索

Python 如何使用正则表达式在字符串中搜索,python,regex,Python,Regex,我现在使用正则表达式来处理一些字符串,现在我有一个特殊的字符串不容易使用正则表达式来处理。下面是一些示例字符串TP-LINK是一个示例,它可以是具有类似格式的其他路由器供应商 TP-LINK Wireless Range Extender WA810RE TP-LINK Wireless WA850RE TP-LINK Wireless Range Extender WA850RE TP-LINK Wireless Range Extender WA890RE 正如您在上面的字符

我现在使用正则表达式来处理一些字符串,现在我有一个特殊的字符串不容易使用正则表达式来处理。下面是一些示例字符串TP-LINK是一个示例,它可以是具有类似格式的其他路由器供应商

TP-LINK Wireless Range Extender WA810RE 
TP-LINK Wireless WA850RE  
TP-LINK Wireless Range Extender WA850RE  
TP-LINK Wireless Range Extender WA890RE  
正如您在上面的字符串中所看到的,我想得到
TP-LINK
,它将使用
TL
WA850RE
,然后最终结果是
TLWA850RE

我在regex中使用了look-ahead,但它似乎不起作用

re1 = 'TP-LINK Wireless Range Extender WA850RE'
m1 = re.search('(T(?=P-)L(?=INK)(.+)(WA\\w+))', re1)

让我快速地问一下,你为什么想要这样一个正则表达式。如果它是一种模式,出现在您使用的许多字符串上,所有这些都适用于某个规则,并且过程的结果始终符合要提供的规则,那么正则表达式可能是正确的工具

例如,对于以下数据,如100秒:

TP-LINK Wireless Range Extender WA850RE > TLWA850RE
CI-CISCO WLAN Extender CWL12345 > CCWL12345
NG-NETGEAR Wifi Ext NG345 > NGNG345
要实现这一点,您可以使用:

(?m)^(\w)\w+-(\w)[\w\s]+?([A-Z0-9]+)$

(?m) perform each pattern between "^" and "$" on each line
^(\w) catch the first character of the first word starting the line
\w+ match any other following word characters
- match a dash
(\w) match the first character following the dash
[\w\s]+? match any words and whitespace as few(non-greedy) as possible
([A-Z0-9]+)$ match any combination of capitals and numbers till EOL
但是,如果您只有一些固定的规则,这些规则出现在以完全相等的序列开头的字符串上,并且正则表达式应该是执行静态替换的复杂方式,那么您的工具可能是错误的。例如:

TP-LINK Wireless Range Extender WA850RE > TLWA850RE
TP-LINK Wireless Range Base WA950RB > TLWA950RB
TP-LINK Wireless Access Point WA87AP > TLWA870AP
在后一种情况下,您应该坚持简单的文本替换,在第一种情况下,正则表达式可能是合适的


换句话说,我怀疑您想要的正则表达式是否适合您的工作。

下面的正则表达式将帮助您找到所需的匹配项:

(\w)\w-(\w)\w+ .* (\w+)$
带取代基

\1\2\3

关于原始正则表达式的一些注意事项:

  • 前瞻只在字符串的末尾才有意义;您可能正在寻找一个非捕获组,例如
    T(?:P-
    ,而不是
    T(?=P-
    ),但如果它们只出现一次,您甚至不需要它们(即,如果不需要在组后面放置
    *
    +
  • 那些
    实际上不是字符串的一部分,因此应该从正则表达式中删除它们
  • 仅在要在结果中使用的部分周围放置捕获组
总而言之,您可以这样做:

>>> m = re.search(r'(T)P-(L)INK.+(WA\w+)', re1)
>>> ''.join(m.groups())
'TLWA850RE'
但是,如果要缩写字符串,只需匹配字符串并使用正则表达式提取重要部分,然后为结果添加前缀。如果组中的
TP-LINK
部分始终相同,则无需捕获。这也将进一步简化正则表达式

>>> m = re.search(r'TP-LINK.+(WA\w+)', re1)
>>> "TL" + m.group(1)
'TLWA850RE'

然后在其他情况下(Netgear、Cisco等)使用类似的正则表达式。

尝试以下操作:这适用于任何项目

import re
p = re.compile(ur'(\w)\w*-(\w).+(\b\w+)', re.MULTILINE | re.IGNORECASE)
test_str = u"TP-LINK Wireless Range Extender WA850RE\nCI-CISCO WLAN Extender CWL12345\nNG-NETGEAR Wifi Ext NG345"
subst = u"\1\2\3"

result = re.sub(p, subst, test_str)

是否总是
WA850RE
?字符串通常是什么样子的?第一个错误:参数是反向的。它是
re.search(pattern,string)
。另外,字符串中没有
\“
,是吗?谢谢,我在OP中更新了它。你到底在字符串中寻找什么?我认为你不需要将字符串括在
'”
中,只需使用单引号
'
实际上,我是你的第一个案例示例。