正则表达式来提取字符串

2024-10-01 13:38:27 发布

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

我需要正则表达式的帮助,以便从字符串中获得以下内容

dal001.caxxxxx.test.com. ---> caxxxxx.test.com
caxxxx.test.com -----> caxxxx.test.com

所以基本上在第一个例子中,我不想要dal001或者任何以3个字母和3个数字开头的东西,如果它只以ca开头,我就不想要字符串的其余部分

在第二个示例中,我希望整个字符串只以ca开头

到目前为止,我已经尝试了(^[a-z]{3}[\d]+\.)?(ca.*),但是当字符串被激活时,它不起作用 dal001.mycaxxxx.test.com

任何帮助都将不胜感激


Tags: 字符串testcom示例字母数字例子ca
3条回答

你可以用

^(?:[a-z]{3}\d{3}\.)?(ca.*)

regex demo。要使其不区分大小写,请使用re.Ire.search(rx, s, re.I),请参见下文)进行编译

详细信息

  • ^-字符串的开头
  • (?:[a-z]{3}\d{3}\.)?一个可选序列,由3个字母、3个数字和.组成
  • (ca.*)-group1:ca和字符串的其余部分

Python demo

import re
rx = r"^(?:[a-z]{3}\d{3}\.)?(ca.*)"
strs = ["dal001.caxxxxx.test.com","caxxxx.test.com"]
for s in strs:
  m = re.search(rx, s)
  if m:
    print( m.group(1) )

像这样使用^{}

import re
strs = ['dal001.caxxxxx.test.com', 'caxxxx.test.com']

for s in strs:
    s = re.sub(r'^[A-Za-z]{3}\d{3}[.]', '', s)
    print(s)
# caxxxxx.test.com
# caxxxx.test.com

如果您正在使用re

import re
my_strings = ['dal001.caxxxxx.test.com', 'caxxxxx.test.com']
my_regex = r'^(?:[a-zA-Z]{3}[0-9]{3}\.)?(ca.*)'
compiled_regex = re.compile(r)
for a_string in my_strings:
    if compiled_regex.match(a_string):
        compiled_regex.sub(r'\1', a_string)

my_regex匹配以[3 letters][3 digits][a .]开头(^锚定到字符串开头)的字符串,但仅可选,并且使用非捕获组((?:)将不会获得编号的引用以在sub中使用)。在任何一种情况下,它都必须包含ca,后跟任何内容,并且该部分在对re.sub的调用中用作替换re.compile用于加快速度,以防有许多字符串需要匹配

关于re.compile的说明: 有些答案不需要在循环之前预先编译正则表达式。他们做了一个交易:删除一行代码,代价是在每次迭代时隐式地重新编译正则表达式。如果要在循环体中使用正则表达式,则应始终首先编译它。这样做会对程序的速度产生重大影响,即使迭代次数很小,也不会增加成本Here is a comparison的编译版本与the same loop using the same regex的非编译版本,用于不同的循环迭代次数和试验次数。你自己判断吧

相关问题 更多 >