社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

有没有办法断言除了python中的一个部分之外,两个字符串是相同的?

pimmer1 • 5 年前 • 1859 次点击  

structure_string = "name|time|mac|type"
string1 = "bob|0|abc|manual"
string2 = "bob|1|abc|manual"

我希望能够断言任何传入的字符串都匹配除时间以外的所有内容。我需要在测试中多次这样做,所以一行代码是理想的。像这样的东西

assert(incoming_string == "bob|#|abc|manual")

这可能吗?

我认为子字符串方法行不通。我有一个想法,就是检查传入字符串的各个部分,但这很麻烦。

incoming_string_list = incoming_string.split("|")
string1_list = string1.split("|")

assert(incoming_string_list[0] == string1_list[0])
assert(incoming_string_list[2] == string1_list[2])
assert(incoming_string_list[3] == string1_list[3])

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53594
 
1859 次点击  
文章 [ 3 ]  |  最新文章 5 年前
Oliver Wienand
Reply   •   1 楼
Oliver Wienand    6 年前

标准方法可能使用正则表达式,例如:

import re

structure_string = r"bob\|.*\|abc\|manual$"
test_structure = re.compile(structure_string)
incoming = [
    "bob|0|abc|manual",
    "bob|1|abc|manual",
    "bob|1|abc|manualX",
    "Xbob|1|abc|manual",
    "anne|1|abc|manual"
]

for incoming_string in incoming:
    print(incoming_string, test_structure.match(incoming_string))

assert test_structure.match(incoming[0]), "Not matching: %s ~ %s" % (structure_string, incoming_string)
assert test_structure.match(incoming[-1]), "Not matching: %s ~ %s" % (structure_string, incoming_string)

bob|0|abc|manual <re.Match object; span=(0, 16), match='bob|0|abc|manual'>
bob|1|abc|manual <re.Match object; span=(0, 16), match='bob|1|abc|manual'>
bob|1|abc|manualX None
Xbob|1|abc|manual None
anne|1|abc|manual None
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
[...]
---> 17 assert test_structure.match(incoming[-1]), "Not matching: %s ~ %s" % (structure_string, incoming_string)

AssertionError: Not matching: bob\|.*\|abc\|manual$ ~ anne|1|abc|manual

官方文件: https://docs.python.org/3/library/re.html#

很好的在线正则表达式工具: https://regex101.com/

DarkDrassher34
Reply   •   2 楼
DarkDrassher34    6 年前

structure_string = "name|time|mac|type"
string1 = "bob|0|abc|manual".split(sep = "|")
string2 = "bob|1|abc|manual".split(sep = "|")

string1.pop(1)
string2.pop(1)

assert(string1 == string2)

Daniel Roseman
Reply   •   3 楼
Daniel Roseman    6 年前

正则表达式就是你想要的。

import re
assert re.match(r"bob\|\d+\|abc\|manual$", incoming_string)

这个 \d+ 是一个或多个数字的占位符。注意,管道字符是转义的,因为它们在regex中有特殊的含义。