python 正则分割字符串

python 正则分割字符串

文章目录

  • python 正则分割字符串
    • 方法1:
    • 方法2:
    • 方法3:
    • 方法4:
    • 方法5:
    • 测试代码
    • 总结

前段时间 对字符串的处理遇到了一个小问题,我希望在一个字符串中做特定的分割, 通过传入一个 pattern正则来分割字符串.

看例子 self.s 就是原始的字符串 ,字符串中包含一个时间,地点,事件 这样的一个结构. 但是下一个结构和上一个结构没有明显的分隔符, 我想通过分割字符串 分割成 self.expected_result 这种格式

    def setUp(self):
        self.s = '14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)15:00,中国科技大学,公司深改领导小组会(视频)班子成员16:30,中国科技大学,C929供应商选择领导小组会-贺董(周总、张总、沈总、戚总)18:30,中国科技大学,国内大飞机产业链布局方案专题会议-周总(张总、沈总)'

        self.expected_result = [
            '14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)',
            '15:00,中国科技大学,公司深改领导小组会(视频)班子成员',
            '16:30,中国科技大学,C929供应商选择领导小组会-贺董(周总、张总、沈总、戚总)',
            '18:30,中国科技大学,国内大飞机产业链布局方案专题会议-周总(张总、沈总)'
        ]

首先想到使用正则模块的re.split 来处理一下

>>> s = '14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)15:00,中国科技大学,公司深改领导小组会(视频)班子成员16:30,中国科技大学,C929供应商选择领导小组会-贺董(周总、张总、沈总、戚总)18:30,中国科技大学,国内大飞机产业链布局方案专题会议-周总(张总、沈总)'
... 
>>> 
>>> 
>>> res  = re.split(r'\d{1,2}:\d{2}',s)
>>> from pprint import pprint 
>>> pprint(res)
['',
 ',中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)',
 ',中国科技大学,公司深改领导小组会(视频)班子成员',
 ',中国科技大学,C929供应商选择领导小组会-贺董(周总、张总、沈总、戚总)',
 ',中国科技大学,国内大飞机产业链布局方案专题会议-周总(张总、沈总)']

结果发现 分割是成功了, 就是分割点 也被删除了. 我是想保留分割点的内容.所以这种方法也不行了.

于是要写个函数来处理

方法1:

通过 re.findall 寻找到 ‘分割点’ 然后记录要分割的索引位置, 最后分割字符串.

from typing import List
import re


def split_str(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """

    正则分割字符串, 根据正则分割特定的字符串

    time_pattern = r'\d{1,2}:\d{2}'
    """
    res_list = re.findall(pattern, s)
    idxs = []
    for res in res_list:
        flag = re.search(res, s)
        if flag:
            idxs.append(flag.span()[0])
    results = []
    idxs_len = len(idxs)
    s_len = len(s)
    if idxs_len <= 1:
        return [s]

    for i in range(1, idxs_len):
        results.append(s[idxs[i - 1]:idxs[i]])

    # last 一个也放进去
    results.append(s[idxs[idxs_len - 1]:s_len])
    return results

方法2:

我们可以这样来实现,每次记录要分割的位置, 当要分割的位置数量为2 时候 ,可以进行分割, 然后删除最先的分割点. 这样就不需要 使用 re.findall ,每次匹配到一个分割点,就把 i更新到分割点最后一个字符的位置, 如果分割点为2个,那么就获取当前的元素,同时删除最先进去的元素. 最后记得 把最后一条分割结果保存一下, 还有特殊的边界情况,就是没有分割点的情况 如何处理.

def regex_split_01(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """
    pattern = r'\d{1,2}:\d{2}'
    """
    result = []
    i = 0
    length = len(s)
    position = deque([])
    while i < length:
        match = re.search(pattern, s[i:])
        if match:
            cur_start_position = match.span()[0] + i
            cur_end_position = match.span()[1] + i
            if len(position) < 2:
                position.append(cur_start_position)
                i = cur_end_position

            if len(position) == 2:
                # collect result
                start, end = position
                result.append(s[start:end])
                i = cur_end_position
                position.popleft()
        else:
            break

    if position:
        # 最后一条分割结果
        result.append(s[position.popleft():length])
    else:
        result.append(s)
    return result

仔细想了一下上面的方法 是否有问题呢? 是否可以在优化一下呢? 首先 就是关于len(position) 的长度判断 是不是可以先放进去 postion 在判断长度呢 ?

方法3:

我们 不需要单独判断 长度是否小于2 ,直接让匹配到位置点 入队列即可. 之后在判断 是否 长度大于等于2 , 然后在进行切割字符串. 切割字符串的时候取出开头的两个位置, 之后要把第二个位置放进去,因为下一次切割还会用到这个分割点.

def regex_split_02(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """
    pattern = r'\d{1,2}:\d{2}'
    """
    result = []
    i = 0
    length = len(s)
    position = deque([])
    while i < length:
        match = re.search(pattern, s[i:])
        if not match:
            # 此时说明 没有找到要分割的点
            break

        cur_start_position = match.span()[0] + i
        cur_end_position = match.span()[1] + i
        position.append(cur_start_position)
        if len(position) >= 2:
            # collect result
            start = position.popleft()
            end = position.popleft()
            # 这里不能丢掉这个元素,还要再次 从左边添加回来,作为下一次切割的位置开始点
            position.appendleft(end)
            result.append(s[start:end])
        i = cur_end_position

    if position:
        # 最后一条分割结果
        result.append(s[position.popleft():length])
    else:
        # 没有要分割的点,直接返回原来的一条结果
        result.append(s)
    return result

此时分割 (a,b) (b,c) (c,最后的位置)

在这里插入图片描述

postion来回 出队列 入队列 确实容易让人产生疑惑. 我们也可以一次性把所有的分割点 都收集一下,最后在进行切割.

方法4:

就是 有分割点就放入position 中 ,最后统一处理分割点. 每次取相邻的分割点, 最后把最后一段放入到结果集中.

def regex_split_03(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """
    pattern = r'\d{1,2}:\d{2}'
    """
    result = []
    i = 0
    length = len(s)
    position = deque([])
    while i < length:
        match = re.search(pattern, s[i:])
        if not match:
            # 此时说明 没有找到要分割的点
            break

        cur_start_position = match.span()[0] + i
        cur_end_position = match.span()[1] + i
        position.append(cur_start_position)
        i = cur_end_position

    # found 分割点
    if position:
        for i in range(1, len(position)):
            result.append(s[position[i - 1]:position[i]])
        result.append(s[position[len(position) - 1]:length])
    else:
        result.append(s)
    return result

如果s 的第一个匹配位置 不在开头的位置, 这样在收集结果的时候 会丢失调 从(0,a) 这段字符串的数据.

例如下面的情况

在这里插入图片描述

所以上面的代码都有这个问题, 第一段数据会被丢掉.

方法5:

改进了一下, 当position 所有的数据 收集了所有的分割点, 我们在首尾添加 两个 位置,分别是 字符串开始位置,以及字符串最后一个位置,这样在遍历 position 数组, 来分割字符串即可.

def regex_split(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """
    pattern = r'\d{1,2}:\d{2}'
    """
    result = []
    i = 0
    length = len(s)
    position = deque([])
    while i < length:
        match = re.search(pattern, s[i:])
        if not match:
            # 此时说明 没有找到要分割的点
            break
        cur_start_position = match.span()[0] + i
        cur_end_position = match.span()[1] + i
        position.append(cur_start_position)
        i = cur_end_position

    # found 分割点
    if position:
        begin = position[0]
        end = position[-1]
        if begin != 0:
            position.appendleft(0)
        if end != length:
            position.append(length)

        for i in range(0, len(position) - 1):
            result.append(s[position[i]:position[i + 1]])
    else:
        result.append(s)
    return result

测试代码

下面给出一个完整的测试代码

测试代码中 我仅仅测试了方法5中,如果匹配不是头开始的情况, 其他的情况 相信 小伙伴可以自己修改代码补上去,使测试代码能够完全跑过去.

@pytest.mark.skip 这个装饰器的内容, 方法1 到方法4 都需要修改一下, 这个 小伙伴可以 修改上面的代码, 使测试代码可以完全通过哦.

from typing import List
import re
from collections import deque

import unittest
import pytest

from pprint import pprint


def split_str(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """

    正则分割字符串, 根据正则分割特定的字符串

    time_pattern = r'\d{1,2}:\d{2}'
    """
    res_list = re.findall(pattern, s)
    idxs = []
    for res in res_list:
        flag = re.search(res, s)
        if flag:
            idxs.append(flag.span()[0])
    results = []
    idxs_len = len(idxs)
    s_len = len(s)
    if idxs_len <= 1:
        return [s]

    for i in range(1, idxs_len):
        results.append(s[idxs[i - 1]:idxs[i]])

    # last 一个也放进去
    results.append(s[idxs[idxs_len - 1]:s_len])
    return results


def regex_split_01(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """
    pattern = r'\d{1,2}:\d{2}'
    """
    result = []
    i = 0
    length = len(s)
    position = deque([])
    while i < length:
        match = re.search(pattern, s[i:])
        if match:
            cur_start_position = match.span()[0] + i
            cur_end_position = match.span()[1] + i
            if len(position) < 2:
                position.append(cur_start_position)
                i = cur_end_position

            if len(position) == 2:
                # collect result
                start, end = position
                result.append(s[start:end])
                i = cur_end_position
                position.popleft()
        else:
            break

    if position:
        # 最后一条分割结果
        result.append(s[position.popleft():length])
    else:
        result.append(s)
    return result


def regex_split_02(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """
    pattern = r'\d{1,2}:\d{2}'
    """
    result = []
    i = 0
    length = len(s)
    position = deque([])
    while i < length:
        match = re.search(pattern, s[i:])
        if not match:
            # 此时说明 没有找到要分割的点
            break

        cur_start_position = match.span()[0] + i
        cur_end_position = match.span()[1] + i
        position.append(cur_start_position)
        if len(position) >= 2:
            # collect result
            start = position.popleft()
            end = position.popleft()
            # 这里不能丢掉这个元素,还要再次 从左边添加回来,作为下一次切割的位置开始点
            position.appendleft(end)
            result.append(s[start:end])
        i = cur_end_position

    if position:
        # 最后一条分割结果
        result.append(s[position.popleft():length])
    else:
        # 没有要分割的点,直接返回原来的一条结果
        result.append(s)
    return result


def regex_split_03(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """
    pattern = r'\d{1,2}:\d{2}'
    """
    result = []
    i = 0
    length = len(s)
    position = deque([])
    while i < length:
        match = re.search(pattern, s[i:])
        if not match:
            # 此时说明 没有找到要分割的点
            break

        cur_start_position = match.span()[0] + i
        cur_end_position = match.span()[1] + i
        position.append(cur_start_position)
        i = cur_end_position

    # found 分割点
    if position:
        for i in range(1, len(position)):
            result.append(s[position[i - 1]:position[i]])
        result.append(s[position[len(position) - 1]:length])
    else:
        result.append(s)

    return result


def regex_split(s: str, pattern=r'\d{1,2}:\d{2}') -> List:
    """
    pattern = r'\d{1,2}:\d{2}'
    """
    result = []
    i = 0
    length = len(s)
    position = deque([])
    while i < length:
        match = re.search(pattern, s[i:])
        if not match:
            # 此时说明 没有找到要分割的点
            break
        cur_start_position = match.span()[0] + i
        cur_end_position = match.span()[1] + i
        position.append(cur_start_position)
        i = cur_end_position

    # found 分割点
    if position:
        begin = position[0]
        end = position[-1]
        if begin != 0:
            position.appendleft(0)
        if end != length:
            position.append(length)

        for i in range(0, len(position) - 1):
            result.append(s[position[i]:position[i + 1]])
    else:
        result.append(s)

    return result


class TestSplitStr(unittest.TestCase):

    def setUp(self):
        self.s = '14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)15:00,中国科技大学,公司深改领导小组会(视频)班子成员16:30,中国科技大学,C929供应商选择领导小组会-贺董(周总、张总、沈总、戚总)18:30,中国科技大学,国内大飞机产业链布局方案专题会议-周总(张总、沈总)'

        self.expected_result = [
            '14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)',
            '15:00,中国科技大学,公司深改领导小组会(视频)班子成员',
            '16:30,中国科技大学,C929供应商选择领导小组会-贺董(周总、张总、沈总、戚总)',
            '18:30,中国科技大学,国内大飞机产业链布局方案专题会议-周总(张总、沈总)'
        ]

    def tearDown(self) -> None:  # 表示该方法没有返回值
        pass

    def test_split(self):
        real_result = split_str(self.s, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, self.expected_result, msg="real != expected result.Test failed...")
        pass

    def test_split_one_match(self):
        data_string = "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = split_str(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")
        pass

    @pytest.mark.skip(reason='split_str_not_begin_match 暂时没有实现不是从头开始匹配的情况')
    def test_split_not_begin_match(self):
        data_string = "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员",
            "15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = split_str(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")
        pass

    def test_split_03_not_match(self):
        real_result = regex_split_03(self.s, pattern=r'Frank\d{1,2}:\d{2}')
        self.assertListEqual(real_result, [self.s], msg="real != expected result.Test failed...")
        pass

    def test_regex_split_03(self):
        real_result = regex_split_03(self.s, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, self.expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split_03_one_match(self):
        data_string = "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = regex_split_03(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split_03_not_match(self):
        real_result = regex_split_03(self.s, pattern=r'Frank\d{1,2}:\d{2}')
        self.assertListEqual(real_result, [self.s], msg="real != expected result.Test failed...")
        pass

    @pytest.mark.skip(reason='regex_split_03_not_begin_match 暂时没有实现不是从头开始匹配的情况')
    def test_regex_split_03_not_begin_match(self):
        data_string = "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员",
            "15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = regex_split_03(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split(self):
        real_result = regex_split(self.s, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, self.expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split_one_match(self):
        data_string = "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = regex_split(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split_not_begin_match(self):
        data_string = "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员",
            "15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = regex_split(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split_01(self):
        real_result = regex_split_01(self.s, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, self.expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split_01_not_match(self):
        real_result = regex_split_01(self.s, pattern=r'Frank\d{1,2}:\d{2}')
        self.assertListEqual(real_result, [self.s], msg="real != expected result.Test failed...")
        pass

    def test_regex_split_01_one_match(self):
        data_string = "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = regex_split_01(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")
        pass

    @pytest.mark.skip(reason='regex_split_01_not_begin_match 暂时没有实现不是从头开始匹配的情况')
    def test_regex_split_01_not_begin_match(self):
        data_string = "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员",
            "15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = regex_split_01(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")

    def test_regex_split_02(self):
        real_result = regex_split_02(self.s, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, self.expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split_02_one_match(self):
        data_string = "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "14:00,中国科技大学,KZB 阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = regex_split_02(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")
        pass

    def test_regex_split_02_not_match(self):
        real_result = regex_split_02(self.s, pattern=r'Frank\d{1,2}:\d{2}')
        self.assertListEqual(real_result, [self.s], msg="real != expected result.Test failed...")
        pass

    @pytest.mark.skip(reason='regex_split_02_not_begin_match 暂时没有实现不是从头开始匹配的情况')
    def test_regex_split_02_not_begin_match(self):
        data_string = "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        expected_result = [
            "阶段总结推进会-贺董(周总、沈总)中国科技大学,公司深改领导小组会(视频)班子成员",
            "15:00,中国科技大学,公司深改领导小组会(视频)班子成员"
        ]
        real_result = regex_split_02(data_string, pattern=r'\d{1,2}:\d{2}')
        self.assertListEqual(real_result, expected_result, msg="real != expected result.Test failed...")


if __name__ == '__main__':
    unittest.main()
    pass

总结

​ 本文总结了一个常见的字符串的处理的问题,如何处理字符串分割, 使用内置的库 re模块 分割 会把 分隔符 弄掉. 基于内置库 无法满足这样的分割, 于是就写了这个文章来进行分割. 通过匹配固定的正则 来实现对字符串的分隔. 文中留了一个小问题, 把方法1到方法4 中 错误的地方, 改正过来, 感兴趣的同学可以评论留言,看到必回.

分享快乐,留住感动. '2024-01-07 13:26:50' --frank

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工程管理系统功能设计与实践:实现高效、透明的工程管理

在现代化的工程项目管理中&#xff0c;一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统&#xff0c;结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…

TS 36.213 V12.0.0-随机接入过程

本文的内容主要涉及TS 36.213&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程&#xff0c;旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要&#xff0c;因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…

gazebo安装版本--公元2024年1月

不好意思我误导了各位&#xff0c;顺便也误导了我自己。。。。。。。。。 harmonic版本只适合单独使用&#xff0c;不适合与ros2配合仿真。 到2024年1月&#xff0c;只有fortress版本能与ros2配合使用

EVA:Exploring the Limits of Masked Visual Representation Learning at Scale

文章目录 AbstractHighlightIntroduction Abstract EVA是一个基础的Transformer视觉模型 预训练任务&#xff1a;训练的图片是masked掉的50%的patches, 模型的任务是预测被遮挡的图像特征。 模型经过预训练&#xff0c;学会了通过图像和文本的对齐关系来重构被遮挡的部分&…

Windows 2012 R2 单网卡安装 PPTPVP*

1、添加远程访问 2、下一步至 角色服务 3、下一步直至 安装完成 4、打开 路由和远程访问 5、配置并启用 6、下一步 自定义配置 7、选择 VPN访问 与 NAT 8、直至完成 启动服务 9、右键 属性 10、配置分配给客户端的IP&#xff0c;这里我配的是172.20.1.0网段&#xff0c;跟我服务…

Python2048小游戏核心算法(python系列26)

前言&#xff1a;做核心算法之前我们可以玩一玩这个小游戏来了解一下规则。2048在线试玩 运行效果&#xff1a; 代码案例&#xff1a; # 2048小游戏# 1.将列表中零移动到列表的末尾 def move_zeroes():x 0for i in range(len(list_nums)):if list_nums[i] ! 0:list_nums[x],…

SQL / MySQL 高级知识点

1. 事务 1.1 什么是数据库事务&#xff1f; ​ 数据库的事务&#xff08;Transaction&#xff09;是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&…

给充电桩嵌入一个强大的“心脏”——工控机

到底什么样的工控机才算是真正的好用&#xff1f; 小编还特地去问了技术老王 他表示&#xff1a;稳定第一&#xff0c;性能第二&#xff01; 不稳定&#xff0c;性能再好也白搭&#xff01; 什么是工控机呢&#xff1f; 工控机是一种专门为工业现场而设计的计算机设备&…

Find My玩具车|苹果Find My技术与玩具车结合,智能防丢,全球定位

玩具车的结构有惯性式、机械式、电动式及电动遥控式等。玩具汽车与仿真汽车模型相比&#xff0c;其尺寸设计灵活&#xff0c;工艺略为粗糙&#xff0c;材料简单。一般采用普通塑料、铁皮制造。玩具车为孩子们提供了娱乐和放松的机会&#xff0c;让他们在游戏中放松身心&#xf…

网安入门12-文件上传(黑白名单,00截断)

黑名单绕过 Pass-03 有的时候后端限制了一些黑名单&#xff0c;比如过滤后缀名.php 我们就可以用黑名单里没有的后缀名进行绕过&#xff0c;例如&#xff1a; 大小写&#xff1a;.phP .pHp .AsPphp1 .php2 .php3 .php9 .phtml&#xff08;成功率较高&#xff09;特殊文件名绕…

基于JavaWeb+BS架构+SpringBoot+Vue+Spark的共享单车数据存储系统的设计和实现

基于JavaWebBS架构SpringBootVueSpark的共享单车数据存储系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 第一章 概述 2 1.1课题研究背景 2 1.2 课题研究意义 2 1.3国内…

消息队列-RockMQ-定时延时发送消息

定时延时发送消息 任务需要延迟一段时间再进行处理。 生产者 public class Producer {public static void main(String[] args) throws Exception {DefaultMQProducer producer new DefaultMQProducer("producer_group");producer.setNamesrvAddr("ip:9876&q…

前端炫酷动画特效分享(附在线预览)

分享7款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 canvas鼠标粒子跟随动画 canvas鼠标粒子跟随动画 当鼠标移入背景区域时 粒子动画会…

Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻直播带货及 免 费 小程序商城搭建的完整指南

随着互联网的快速发展&#xff0c;越来越多的企业开始注重数字化转型&#xff0c;以提升自身的竞争力和运营效率。在这个背景下&#xff0c;鸿鹄云商SAAS云产品应运而生&#xff0c;为企业提供了一种简单、高效、安全的数字化解决方案。 鸿鹄云商SAAS云产品是一种基于云计算的软…

jvm虚拟机初识

JVM Java虚拟机就是二进制字节码的运行环境&#xff0c;负责装载字节码到其内部&#xff0c;解释/编译为对应平台上的机器指令执行。每一条Java指令&#xff0c;Java虚拟机规范中都有详细定义&#xff0c;如怎么取操作数&#xff0c;怎么处理操作数&#xff0c;处理结果放在哪…

4.7 MEMORY AS A LIMITING FACTOR TO PARALLELISM

虽然CUDA寄存器和共享内存在减少对全局内存的访问次数方面非常有效&#xff0c;但必须注意保持在这些内存的容量范围内。这些内存是线程执行所需的资源形式。每个CUDA设备提供有限的资源&#xff0c;从而限制了给定应用程序可以同时驻留在SM中的线程数量。通常&#xff0c;每个…

setup 语法糖

只有vue3.2以上版本可以使用 优点&#xff1a; 更少的样板内容&#xff0c;更简洁的代码 能够使用纯 Typescript 声明props 和抛出事件 更好的运行时性能 更好的IDE类型推断性能 在sciprt标识上加上setup 顶层绑定都可以使用 不需要return &#xff0c;可以直接使用 使用组件…

快速学习SpringBoot

SpringBoot springboot传统方式构建spring应用程序使用springboot子项目构建起步依赖自动配置其它特性 SpringBoot项目部署Spring项目部署属性配置方式命令行参数方式配置环境变量方式外部配置文件方式 多环境开发-Pofiles多环境开发分组 springboot 传统方式构建spring应用程…

Unity中URP下开启和使用深度图

文章目录 前言一、在Unity中打开URP下的深度图二、在Shader中开启深度图1、使用不透明渲染队列才可以使用深度图2、半透明渲染队列深度图就会关闭 三、URP深度图 和 BRP深度图的区别四、在Shader中&#xff0c;使用深度图1、定义纹理和采样器2、在片元着色器对深度图采样并且输…