用Python3编程。
我很难控制字符串是否符合特定格式。
所以,我知道Python没有像Java这样的.contain()
方法,但我们可以使用正则表达式。
因此,我的代码可能看起来像这样,其中lowpan_headers是一个字段,字段是一个应该符合特定格式的字符串。
所以代码可能是这样的:
import re
lowpan_headers = self.converter.lowpan_string_to_headers(lowpan_string)
pattern = re.compile("^([A-Z][0-9]+)+$")
pattern.match(lowpan_headers[dest_addrS])
然而,我的问题是格式,我无法做到正确。
格式应该类似bbbb00000000000000170d0000306fb6
,其中前4个字符应为bbbb
,其余所有其余字段应为十六进制值(因此从0-9和af开始)。
所以有两个问题: (1)除了通过导入re之外,任何更简单的方法 (2)如果没有,你能帮我解决正则表达式吗?
答案 0 :(得分:5)
至于正在寻找的正则表达式,我相信
^bbbb[0-9a-f]{28}$
应根据您的要求正确验证。
至于是否有比使用re
模块更简单的方法,我会说没有真正实现您正在寻找的结果。虽然在python中使用in
关键字的方式与您期望contains
方法为字符串一起工作的方式有效,但实际上您想知道字符串是否格式正确。因此,最简单的解决方案是使用正则表达式,因此使用re
模块。
答案 1 :(得分:1)
以下是不使用regex
的解决方案:
lowpan_headers = 'bbbb00000000000000170d0000306fb6'
if lowpan_headers[:4] == 'bbbb' and len(lowpan_headers) == 32:
try:
int(lowpan_headers[4:], 16) # tries interpreting the last 28 characters as hexadecimal
print('Input is valid!')
except ValueError:
print('Invalid Input') # hex test failed!
else:
print('Invalid Input') # either length test or 'bbbb' prefix test failed!
答案 2 :(得分:1)
实际上,Python确实具有与.contains()
方法等效的方法。您可以使用in
运算符:
if 'substring' in long_string:
return True
类似的问题已经回答here。
但是,对于您的情况,我仍然坚持使用正则表达式,因为您确实正在尝试评估某种字符串格式。为了确保您的字符串只有十六进制值,即0-9和a-f,以下正则表达式应该这样做:^[a-fA-F0-9]+$
。额外的“并发症”是字符串开头的四个“b”。我认为一个简单的解决方法是将它们包括在内:^(bbbb)?[a-fA-F0-9]+$
。
>>> import re
>>> pattern = re.compile('^(bbbb)?[a-fA-F0-9]+$')
>>> test_1 = 'bbbb00000000000000170d0000306fb6'
>>> test_2 = 'bbbb00000000000000170d0000306fx6'
>>> pattern.match(test_1)
<_sre.SRE_Match object; span=(0, 32), match='bbbb00000000000000170d0000306fb6'>
>>> pattern.match(test_2)
>>>
当前缺少的部分是检查字符串的确切长度,您可以使用字符串长度方法或扩展正则表达式 - 但我相信你可以从这里获取它:-)
答案 3 :(得分:0)
正如我在评论中提到的,Python 确实具有等效的contains()
。
if "blah" not in somestring:
continue
如果您希望使用正则表达式来验证输入,可以使用:
^b{4}[0-9a-f]{28}$
- Regex101 Demo with explanation