加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

regex – 正则表达式,用于重新排序字段中的字符串

发布时间:2020-12-14 05:58:28 所属栏目:百科 来源:网络整理
导读:我正在尝试编写一个带有正则表达式的程序来清理一些数据.假设我有一个带有字母和数字的房间名称.在最终输出中,我需要使用“完整字符串(不包括字母和数字)字母编号”模式输出房间名称,如下面的示例所示.但是,到目前为止我写的正则表达式,我得到了非常混乱的结
我正在尝试编写一个带有正则表达式的程序来清理一些数据.假设我有一个带有字母和数字的房间名称.在最终输出中,我需要使用“完整字符串(不包括字母和数字)字母编号”模式输出房间名称,如下面的示例所示.但是,到目前为止我写的正则表达式,我得到了非常混乱的结果,这是我的消息的底部.由于某种原因,它会在某些行上放置字母和字符,即使输入数据中可能没有.谢谢.

编辑:我对输入数据进行了编辑.我想概括代码以获取任意数量的字符串,而不仅仅是单词“ROOM”.

# the pattern should be "the full string (excluding letter & number) + letter + number". For example:
ATLANTA ROOM
ATLANTA ROOM 3
NEW YORK ROOM A 2
ROOM A 4
THE BIG AWESOME ROOM B
ROOM B 4
GEORGETOWN ROOM B 2
NEW YORK ROOM C 2
NEW YORK ROOM C
LOS ANGELES ROOM E 2

# program to clean with regular expressions. there could be multiple spaces between words
dd <- c("ATLANTA ROOM "," ATLANTA ROOM  3","NEW YORK A ROOM   2","4 ROOM A","THE BIG AWESOME ROOM B"," ROOM 4 B","GEORGETOWN B 2 ROOM "," C NEW YORK ROOM 2","NEW YORK ROOM C","LOS ANGELES ROOM 2  E")

m_char_num <- regexpr("(<A|B|C|D|E|1|2|3|4>)",dd)
m_char <- regexpr("(<A|B|C|D|E>)",dd)
m_num <- regexpr("(<1|2|3|4>)",dd)

(dd2 <- paste(gsub("( +)"," ",gsub("(^ +)|( +$)","",gsub("(<A|B|C|D|E|1|2|3|4>)",dd))),regmatches(dd,m_char),m_num),sep = " "))

# actual output from the program
"TLANTA ROOMA3","TLANTA ROOMA2","NW YORK ROOMA4","ROOMA4","TH IG WSOM ROOME2","ROOMB2","GORGTOWN ROOMB2","NW YORK ROOMC3","NW YORK ROOMC2","LOS NGLS ROOMA4"

解决方法

这是一个尝试:

sub(' $','',# clean up spaces at the end
    gsub(' +',' ',# clean up double spaces
         # rearrange letter and numbers
         sub('^([A-Z]?)([0-9]*)([A-Z]?)$','ROOM 13 2',gsub(' |ROOM',dd)    # remove spaces and ROOM
            )
        )
   )
#[1] "ROOM"     "ROOM 3"   "ROOM A 2" "ROOM A 4" "ROOM B"   "ROOM B 4" "ROOM B 2"
#[8] "ROOM C 2" "ROOM C"   "ROOM E 2"

以下是编辑后的OP和评论的相同逻辑(假设房间名称是至少包含3个字母且最多为2个字母的房间名称的单词):

gsub('(^ | $)',# clean up spaces in front or end
     gsub(' +',# clean up double spaces
          # extract room name and put it in front of the letter and number
          paste(gsub('b([A-Z][A-Z]?|[0-9]+)b',dd,perl = T),sub('^([A-Z]+)?([0-9]*)([A-Z]+)?$','13 2',gsub(' |www+',dd)    # remove spaces and words
                   )
               )
         )
    )

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读