Drop1 2023-04-26 21:34 采纳率: 37.5%
浏览 66

正则 想忽略前29个半角位置,但全角字符影响了。

一个文本文件中,内容如下:(注:横线上方我标记的是位置。)

123456......                30 31 32 33 ......
------------------------------------------------------------------------------------------------
AA山田 花1         1234           aaa
AA山田 下夫12       1111           aaa
AA山田 下夫1        1212           aaa
AA山田 下夫123      2323           aaa
AA山田 下夫12       8888           aaa
......
......
......

我的目的是:
  检查半角的第30位开始的连续4位不全是数字的查找出来,于是我用了这个正则:^.{29}(?!\d{4})

  但是因为第3位开始是全角的日文姓名再加一些全角的数字,而正则中的“.”匹配的是半角或全角,在匹配全角字符时,正则会当成1个字符,但实际它占了2个半角的位置,就导致“.{29}”匹配之后实际的位置就到了第32、33位之后。

  我想直接用一个正则表达式来解决这个问题,因为就是在文本文件中,不想利用编程解决。

我自己的一些思考:
  正则中是否有只匹配位置的功能?如果有的话,我就只忽略前29个半角位置,可能就能解决这个问题。

想请教朋友们,非常感谢!

  • 写回答

2条回答 默认 最新

  • 文盲老顾 WEB应用领新星创作者 2023-04-26 22:29
    关注

    不管全角还是半角,对于正则来说,都是一个字符,他不会计算这个字符到底是几位组成的

    另外, 既然你已经要用正则了,就不要局限于索引位置了,局限索引位置,是字符串方法,不是正则方法

    import re
    
    a = '''AA山田 花1         1234           aaa
    AA山田 下夫12       1111           aaa
    AA山田 下夫1        1212           aaa
    AA山田 下夫123      2323           aaa
    AA山田 下夫12       8888           aaa'''
    
    # 不能是四个数字
    print(re.findall(r'(?:^|\n)([^\s]+)\s+([^\s]+)\s+((?!\d{4})[^\s]+)\s+([^\s]+)',a))
    
    不能是四个相同数字
    print(re.findall(r'(?:^|\n)([^\s]+)\s+([^\s]+)\s+((?!(\d)\4{3})[^\s]+)\s+([^\s]+)',a))
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 4月26日
  • 修改了问题 4月26日
  • 创建了问题 4月26日

悬赏问题

  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢
  • ¥15 vxworks交叉编译gcc报错error: missing binary operator before token "("
  • ¥15 JSzip压缩文件时如何设置解压缩密码