regex 如何创建正则表达式来匹配只包含十六进制数字和箭头的字符串?

nfeuvbwi  于 2022-12-19  发布在  其他
关注(0)|答案(4)|浏览(139)

我使用的字符串包含以下字符:

0-9    
a-f    
A-F    
-
>

大于号和连字符的组合必须为:

->
-->

下面是我目前得到的正则表达式:

[0-9a-fA-F\-\>]+

我尝试过使用^的exclusion,但它们不起作用:

[^g-zG-Z][0-9a-fA-F\-\>]+
^g-zG-Z[0-9a-fA-F\-\>]+
[0-9a-fA-F\-\>]^g-zG-Z+
[0-9a-fA-F\-\>]+^g-zG-Z
[0-9a-fA-F\-\>]+[^g-zG-Z]

以下是一些示例:

"0912adbd->12d1829-->218990d"
"ab2c8d-->82a921->193acd7"
hiz5n14c

hiz5n14c1#

首先,您不需要转义->
下面是对我有效的正则表达式:
^([0-9a-fA-F]*(->)*(-->)*)*$
下面是另一个正则表达式:
^([0-9a-fA-F]*(-+>)*)*$
正则表达式做什么?

  • ^匹配字符串的开头,$匹配结尾。
  • *与前面标记的0个或多个示例匹配
  • 已创建大()捕获组以匹配任何令牌。
  • [0-9a-fA-F]匹配范围内的任何字符。
  • (->)(-->)仅与那些给定的示例匹配。

把它变成代码:

import re
regex = "^([0-9a-fA-F]*(->)*(-->)*)*$"
re.match(re.compile(regex),"0912adbd->12d1829-->218990d")
re.match(re.compile(regex),"ab2c8d-->82a921->193acd7")
re.match(re.compile(regex),"this-failed->so-->bad")

您也可以将其转换为布尔值:

print(bool(re.match(re.compile(regex),"0912adbd->12d1829-->218990d")))
print(bool(re.match(re.compile(regex),"ab2c8d-->82a921->193acd7")))
print(bool(re.match(re.compile(regex),"this-failed->so-->bad")))

输出:

True
True
False

我建议使用regexr.com来检查正则表达式。

7vhp5slm

7vhp5slm2#

如果必须使用不区分大小写的模式在字符串的开头或结尾显示箭头:

^[a-f\d]+(?:-{1,2}>[a-f\d]+)+$
    • 说明**
  • ^字符串开始
  • [a-f\d]+匹配1+字符a-f或数字
  • (?:作为一个整体重复的非捕获组
  • -{1,2}>[a-f\d]+匹配--->,后跟1+字符a-f或数字
  • )+关闭非捕获组并重复1次以上
  • $字符串结束

请参见regex demoPython demo

import re

pattern = r"^[a-f\d]+(?:-{1,2}>[a-f\d]+)+$"
s = ("0912adbd->12d1829-->218990d\n"
            "ab2c8d-->82a921->193acd7\n"
            "test")
print(re.findall(pattern, s, re.I | re.M))

产出

[
  '0912adbd->12d1829-->218990d',
  'ab2c8d-->82a921->193acd7'
]
mdfafbf1

mdfafbf13#

如果我理解您的需求,您需要一个十六进制数序列(如a01d11efeb23,用带有一个或两个连字符的箭头分隔(->-->))。
十六进制部分的正则表达式是[0-9a-fA-F]+(假设它不能为空)。
箭头的正则表达式可以是-{1,2}>或(-〉|- —〉).
除了第一个十六进制数之外,只有在每个十六进制数前面需要箭头,因此您将分两部分构建最终的正则表达式:第一个数字,然后重复箭头和数字。
因此,一般结构如下:

NUMBER(ARROW NUMBER)*

它给出了以下正则表达式:

[0-9a-fA-F]+(-{1,2}>[0-9a-fA-F]+)*
nkoocmlb

nkoocmlb4#

在“箭头”上输入re.split(),然后检查所有生成的字符串是否都是纯十六进制,这可能更直观:

import re

def check_hex_arrows(inp):
    parts = re.split(r"-{1,2}>", inp)
    return all(re.match(r"^[0-9a-fA-F]*$", p) for p in parts)

测试:

test_strings = ["0912adbd->12d1829-->218990d",
                "ab2c8d-->82a921->193acd7",
                "0912adbd",
                "0912adbd-12345",
                "abcfdefghi",
                "abcfdef----->123",
                "abcfdefghi----->123" ]

for t in test_strings:
    print(t, check_hex_arrows(t))

给出:

0912adbd->12d1829-->218990d True
ab2c8d-->82a921->193acd7 True
0912adbd True
0912adbd-12345 False
abcfdefghi False
abcfdef----->123 False
abcfdefghi----->123 False

相关问题