如何使用regex在字符串中搜索

2024-05-14 03:56:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在使用regex来处理一些字符串,现在我有一个特殊的字符串不容易使用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,它将使用TL,然后是WA850RE,最后的结果是TLWA850RE

我在regex中使用了look-ahead,但它似乎不起作用。你知道吗

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

Tags: 字符串示例格式link路由器range供应商regex
3条回答

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

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

带取代基

\1\2\3

DEMO

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

例如,有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

但是如果你有一些固定的规则,出现在以完全相等的序列开始的字符串上,并且regex应该是执行静态替换的复杂方式,那么你的工具可能是错误的。例如:

TP-LINK Wireless Range Extender WA850RE > TLWA850RE
TP-LINK Wireless Range Base WA950RB > TLWA950RB
TP-LINK Wireless Access Point WA87AP > TLWA870AP

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

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

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

  • 向前看只在字符串的末尾才有意义;您可能正在寻找一个非捕获组,例如T(?:P-)而不是T(?=P-),但是如果它们只出现一次,您甚至不需要它们(即,如果不需要在组后面放置*+?
  • 这些"实际上不是字符串的一部分,因此应该从regex中删除它们
  • 仅在要在结果中使用的部分周围放置捕获组。你知道吗

总而言之,你可以这样做:

>>> 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等)使用类似的正则表达式

相关问题 更多 >