免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2777 | 回复: 11

[文本处理] 字符串处理 [复制链接]

招聘 : 质量管理
论坛徽章:
0
发表于 2017-12-13 20:41 |显示全部楼层
str=“123&&sdfsfdsdfsf;123s9d9fsdf12315677a1”

如果有一个字符str,字符串str中有特殊字符。
问用bash 或者python 脚本找出相同类型(数字/字符串)最长连续的字符。 我这个例子中最长连续的的整数型是12315677, 最长的连续字符是sdfsfdsdfsf。

今天去面试被问到了, 到现在还没思路, 求解答!!!

论坛徽章:
5
CU十四周年纪念徽章
日期:2017-08-28 17:16:1915-16赛季CBA联赛之北控
日期:2018-03-29 11:39:0615-16赛季CBA联赛之上海
日期:2018-05-21 10:46:10技术图书徽章
日期:2018-09-03 13:54:18技术图书徽章
日期:2018-09-03 13:54:28
发表于 2017-12-14 10:57 |显示全部楼层
  1. echo "123&&sdfsfdsdfsf;123s9d9fsdf12315677a1" | awk '{split($0,a,"[^0-9]") ; split($0,b,"[^a-zA-Z]") ; for(i in a) A=length(A)<length(a[i])?a[i]:A ; print A ; for(j in b) B=length(B)<length(b[j])?b[j]:B ; print B}'
复制代码

论坛徽章:
0
发表于 2017-12-14 15:57 |显示全部楼层
# cat get_max_pattern.py
  1. #!/bin/python
  2. import re
  3. str="123&&sdfsfdsdfsf;123s9d9fsdf12315677a1"
  4. pattern = re.compile(r'[1-9]+')
  5. getmumpattern = re.findall((pattern), str)
  6. getmumpattern.sort(key=len)
  7. print getmumpattern[-1]
  8. pattern = re.compile(r'[a-zA-Z]+')
  9. getstrpattern = re.findall((pattern), str)
  10. getstrpattern.sort(key=len)
  11. print getstrpattern[-1]
复制代码

# python get_max_pattern.py
12315677
sdfsfdsdfsf

论坛徽章:
0
发表于 2017-12-14 16:02 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-12-14 16:50 编辑
  1. [string]$分隔符 = 1..9 + ';' + '&'
  2. $str = “123&&sdfsfdsdfsf;123s9d9fsdf12315677a1” #powershell 支持中文单双引号
  3. $str -split "[$分隔符]" |Sort-Object -Property length -Descending | Select-Object -First 1
  4. #sdfsfdsdfsf


  5. $str -split "[^0-9]"|Sort-Object -Property length -Descending | Select-Object -First 1
  6. #12315677
复制代码


论坛徽章:
21
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59
发表于 2017-12-14 17:42 |显示全部楼层
回复 1# blueskysee


  1. echo "123&&sdfsfdsdfsf;123s9d9fsdf12315677a1"|awk '{a=patsplit($0,s,"[0-9]+");b=patsplit($0,t,"[a-z]+");for(i=1;i<=a;i++){m=length(m)<length(s[i])?s[i]:m};for(i=1;i<=b;i++){n=length(n)<length(t[i])?t[i]:n};print m,n}'
复制代码

输出:
12315677 sdfsfdsdfsf

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2017-12-14 21:10 |显示全部楼层
本帖最后由 q1208c 于 2017-12-14 21:11 编辑

回复 1# blueskysee

贪婪匹配,然后算算哪个长 ?

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-12-15 05:14 |显示全部楼层
回复 1# blueskysee

1. awk code

$ str="123&&sdfsfdsdfsf;123s9d9fsdf12315677a1"

$ echo $str | awk -f get_longer.awk
number: 12315677
string: sdfsfdsdfsf

$ cat get_longer.awk

  1. function get_longer(str, pattern,   t,a,n,len,ret){
  2.   sub("\\[","[^",pattern);
  3.   t = split(str, a, pattern);

  4.   len = 0;
  5.   ret = "";
  6.   for(n=1; n<=t; ++n){
  7.     if(len < length(a[n])){
  8.       len = length(a[n]);
  9.       ret = a[n];
  10.     }
  11.   }
  12.   return ret;
  13. }

  14. {
  15.   print "number:", get_longer($0, "[0-9]+");
  16.   print "string:", get_longer($0, "[a-zA-Z]+");
  17. }
复制代码



#---------------------------------------------------------------------

2. Perl code

$ perl get_longer.pl
number: 12315677
string: sdfsfdsdfsf

$ cat get_longer.pl

  1. use strict;
  2. use warnings;

  3. sub get_longer{
  4.   my($sStr, $sPattern) = @_;
  5.   my $sRet = "";
  6.   my $sLen = 0;
  7.   while($sStr =~ m/($sPattern)/g){
  8.     if($sLen < length($1)){
  9.       $sLen = length($1);
  10.       $sRet = $1;
  11.     }
  12.   }
  13.   return $sRet;
  14. }

  15. my $sStr = "123&&sdfsfdsdfsf;123s9d9fsdf12315677a1";

  16. print "number: ", get_longer($sStr, '\d+'), "\n";
  17. print "string: ", get_longer($sStr, '[a-zA-Z]+'), "\n";

复制代码


#---------------------------------------------------------------------

3. Python code

$ python get_longer.py
number: 12315677
string: sdfsfdsdfsf

$ cat get_longer.py

  1. import os,sys,re

  2. def get_longer(sStr, pattern):
  3.   rPtn = re.compile("(" + pattern + ")")
  4.   sRet = ""
  5.   sLen = 0
  6.   for s in rPtn.findall(sStr):
  7.     if(sLen <len(s)):
  8.       sLen = len(s)
  9.       sRet = s
  10.     #;
  11.   #;
  12.   return sRet
  13. #;

  14. sStr="123&&sdfsfdsdfsf;123s9d9fsdf12315677a1"

  15. print "number:", get_longer(sStr, "\d+")
  16. print "string:", get_longer(sStr, "[a-zA-Z]+")
复制代码



论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2017-12-15 09:43 |显示全部楼层
本帖最后由 yinyuemi 于 2017-12-15 09:44 编辑

回复 1# blueskysee

  1. sed -nr '
  2. # 数字最长
  3. #s/[0-9]+/\n&\n/g;
  4. #s/^[^0-9]+$//Mg;

  5. # 字符串最长
  6. s/[[:alpha:]]+/\n&\n/g;
  7. s/^[^[:alpha:]]+$//Mg;


  8. s/^\n//Mg;
  9. s/\n$//;
  10. h;
  11. :a;
  12.     :b;
  13.     s/^([^\n])([^\n]*)\n([^\n])([^\n]*)/\2\n\4/;
  14.     tb;
  15.     /^\n[^\n]+/bc;
  16.     /^[^\n]+\n|^\n\n\n/bd;
  17.     :c;
  18.         g;
  19.         s/^[^\n]+\n//;
  20.         h;
  21.         ta;
  22.     :d;
  23.         g;
  24.         s/(^[^\n]+)\n[^\n]+/\1/;
  25.         h;
  26.         ta;
  27. x;
  28. p
  29. '
复制代码

论坛徽章:
0
发表于 2017-12-15 14:52 |显示全部楼层
回复 1# blueskysee

perl longest.pl

  1. #!/usr/bin/perl
  2. use 5.010;

  3. $_ = "123&&sdfsfdsdfsf;123s9d9fsdf12315677a1";
  4. my ($num) = sort { length $b <=> length $a } /(\d+)/g;
  5. my ($str) = sort { length $b <=> length $a } /([a-zA-Z]+)/g;

  6. say "num = $num";
  7. say "str = $str";
复制代码

num = 12315677
str = sdfsfdsdfsf

论坛徽章:
0
发表于 2017-12-18 10:28 |显示全部楼层
# coding:utf-8
# !/bin/python

# 有个字符串str1为123&&sdfsfdsdfsf;123s9d9fsdf12315677a1
# 用 shell或者python找出其中最长匹配的连续的字符串或者数字

import re
str1 = '123&&sdfsfdsdfsf;123s9d9fsdf12315677a1'
pattern_str = re.compile('[a-zA-Z]+')
pattern_num = re.compile('[0-9]+')
pattern_str_max = re.findall(pattern_str, str1)
pattern_num_max = re.findall(pattern_num, str1)
# find the longest str

res_str = ""
for i in pattern_str_max:
    if len(i) > len(res_str):
        res_str = i

# find the longest num
res_num = ""
for j in pattern_num_max:
    if len(j) > len(res_num):
        res_num = j

print("the longest str is %s; the longest num is %s" % (res_str, res_num))
==============================================
the longest str is sdfsfdsdfsf; the longest num is 12315677
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP