【问题标题】:Counting a character a number of times数一个字符数次
【发布时间】:2017-12-01 00:23:40
【问题描述】:

一旦一个字符在 Python 中的字符串中出现多次,我想要做的是中断程序。

这是我得到的输出:

b'30,22,37,293,29,26,55,30D\r\n$GPGSV,3,1,11,01,04,250,,03,21,309,24,08,15,200,,10,20,157 ,*7B\r\n$GPGSV,3,2,11,14,49,062,37,16' b'8,W,001328.00,A,A*70\r\n9,26,55,359,30*75\r\n$GPGSV,3,3,11,27,40,170,38,31,20,022,14, 32,42,094,35*4C\r\n$GPGLL,0226.72251,N,0' b'A*2E\r\n$GPGGA,001329.00,A,A*70\r\n$GPRMC,001329.00,A,0226.72248,N,07635.92031,W,0.008,,011217,,,A*64\r \n$GPVTG,,T,,M,0.008,N,' b'2.25,1.08,1.98*0D\r\n$GPG1329.00,0226.72248,N,07635.92031,W,1,08,1.08,1769.1,M,9.8,M,,*4C\r\n$GPGSA, A,3,16,32,26,31,14,22,27'

所以我想在第五个“b”出现后停下来。

【问题讨论】:

  • 您试图通过以这种方式解析看起来是字节字符串的内容来完成什么?这几乎可以肯定是一个 XY 问题。
  • 到目前为止你尝试过什么?你有什么代码已经产生了这个输出?
  • 它是来自 GPS 模块的流数据,到目前为止我还没有找到一个库来解析它,所以我想这样做试图阻止它,因为流继续来了
  • 如果您在解析时遇到问题,请将其设为原始字符串,然后将其拆分为 [,]。之后创建两个列表,在一个列表中添加所有元素,在另一个列表中添加 if 'b in word,然后继续跟踪第二个列表的 len,只要它越过 len 5 打破循环或 sys.exit()
  • 你试过什么?给我们看一些代码...

标签: python micropython


【解决方案1】:

您可以尝试正则表达式并捕获 group(),

您是否正在寻找这样的东西:

import re
pattern=r"b'[0-9]+"

data="""b'30,22,37,293,29,26,55,30D\r\n$GPGSV,3,1,11,01,04,250,,03,21,309,24,08,15,200,,10,20,157,*7B\r\n$GPGSV,3,2,11,14,49,062,37,16'
b'8,W,001328.00,A,A*70\r\n9,26,55,359,30*75\r\n$GPGSV,3,3,11,27,40,170,38,31,20,022,14,32,42,094,35*4C\r\n$GPGLL,0226.72251,N,0'
b'A*2E\r\n$GPGGA,001329.00,A,A*70\r\n$GPRMC,001329.00,A,0226.72248,N,07635.92031,W,0.008,,011217,,,A*64\r\n$GPVTG,,T,,M,0.008,N,'
b'2.25,1.08,1.98*0D\r\n$GPG1329.00,0226.72248,N,07635.92031,W,1,08,1.08,1769.1,M,9.8,M,,*4C\r\n$GPGSA,A,3,16,32,26,31,14,22,27'"""

all_items=[]
track=[]
for i in data.split(','):
    pr=re.search(pattern,i)
    if len(track)==5:
        break
    else:
        if pr!=None:
            track.append(pr.group())
            all_items.append(pr.group())
        else:
            all_items.append(i)

print(all_items)

如果出现第二个“b”,让我们尝试而不是 5:

all_items=[]
track=[]
for i in data.split(','):
    pr=re.search(pattern,i)
    if len(track)==2:
        break
    else:
        if pr!=None:
            track.append(pr.group())
            all_items.append(pr.group())
        else:
            all_items.append(i)

print(all_items)

输出:

["b'30", '22', '37', '293', '29', '26', '55', '30D\r\n$GPGSV', '3', '1', '11', '01', '04', '250', '', '03', '21', '309', '24', '08', '15', '200', '', '10', '20', '157', '*7B\r\n$GPGSV', '3', '2', '11', '14', '49', '062', '37', "b'8"]

你可以在那里替换 5 而不是 3。

【讨论】:

    【解决方案2】:
    import re
    from machine import UART
    uart = UART(2, 9600)
    
    pattern=r"b'[0-9]+"
    
    while True:
      if uart.any():
        data=uart.read()
        all_items=[]
        track=[]
        for i in data.split(','):
            pr=re.search(pattern,i)
            if len(track)==5:
                break
            else:
                if pr!=None:
                    track.append(pr.group())
                    all_items.append(pr.group())
                else:
                    all_items.append(i)
    
        print(all_items)
    
    
    
    this would be the code apllied to my project, but I get this error:
    
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 12, in <module>`enter code here`
    TypeError: can't convert 'str' object to bytes implicitly
    

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2021-11-22
      • 1970-01-01
      • 2017-12-16
      相关资源
      最近更新 更多