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

时间:2015-06-23 08:02:20

标签: 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代替使用TLWA850RE,然后最终结果为TLWA850RE

我正在使用正则表达式,但它似乎不起作用。

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

4 个答案:

答案 0 :(得分:3)

关于原始正则表达式的一些注释:

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

放在一起,你可以这样做:

"

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

TP-LINK

然后针对其他案例(Netgear,思科等)的类似正则表达式

答案 1 :(得分:0)

让我快点问,你为什么要这样的正则表达式?如果它是一个模式,它出现在您使用的许多字符串上,那些都适用于某个规则,并且该过程的结果总是根据要提供的规则,而正则表达式可能是正确的工具。

例如,使用100s之类的数据:

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

在后一种情况下,你应该坚持简单的文本替换,在第一种情况下,正则表达式可能是合适的。

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

答案 2 :(得分:0)

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

(\w)\w-(\w)\w+ .* (\w+)$

与替代

\1\2\3

DEMO

答案 3 :(得分:0)

试试这个:这适用于任何项目..

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)

<强> Demo