【问题标题】:Convert a long string into a matrix, cleaning it将长字符串转换为矩阵,并对其进行清理
【发布时间】:2015-12-10 21:52:27
【问题描述】:

我有一个很大的文本文件,它只是一个很长的字符串。这是一个巨大的文本块。

此文件的原始创建者试图通过在一定数量的字母后设置\n 制表符来使其成为“矩阵”。

string = "adfajdslfkajsddf&&adfadfladfsjdfl\nadk...fhaldkfjahsdf"

使用带有模块re(可能)的正则表达式,我如何将这个大字符串的每个字符输入到它原本应该是的矩阵中?

此外,字符串中还有一些乱码,如“&”、“#”和“{”。有标准模块可以使用吗?

我想人们可以获取原始字符串,根据 '\n' 标记的位置将其分解为几个字符串,然后将这些字符串以某种方式按字符串的每个单独字符放入一个 numpy ndarray。

【问题讨论】:

  • 请提供预期的输出,不要忘记提及您已经尝试开发的代码。
  • 什么是有效或无效字符?
  • @PadraicCunningham 任何字母/整数都是有效的。所有其他符号都是要删除的垃圾。这应该与 re 和一个 if 语句有关,遍历整个字符串。
  • 标点符号都是垃圾吗?
  • @PadraicCunningham 我明白你在说什么。 isalpha() 可能是要走的路

标签: python regex string numpy matrix


【解决方案1】:

您可以通过多种方式做到这一点,您可以检查每个字符是否为字母数字:

stg = "abcde123]\nefghi456}\njk{lmn789"
import numpy as np

arr = np.array([ch for line in stg for ch in line if ch.isdigit() or ch.isalpha()])

或者如果所有的垃圾都是标点符号,你可以str.translate:

from string import punctuation

junk = {ord(ch):"" for ch in punctuation + "\n"}


arr = np.array(list(stg.translate(junk)))

两者都会给你一个平面列表:

['a' 'b' 'c' 'd' 'e' '1' '2' '3' 'e' 'f' 'g' 'h' 'i' '4' '5' '6' 'j' 'k' 'l' 'm' 'n' '7' '8' '9']

如果你想要多维数组,你可以在换行符上拆分:

arr = np.array([[ch for ch in line ] for line in stg.translate(junk).split()])

arr = np.array([[ch for ch in line if ch.isdigit() or ch.isalpha()] for line in stg.split()])

这会给你:

[['a' 'b' 'c' 'd' 'e' '1' '2' '3']
 ['e' 'f' 'g' 'h' 'i' '4' '5' '6']
 ['j' 'k' 'l' 'm' 'n' '7' '8' '9']]

对于 python2,translate 有点不同:

from string import punctuation
import numpy as np


stg = "abcde123]\nefghi456}\njk{lmn789"
arr = np.array([[ch for ch in line ] for line in stg.translate(None, punctuation).split()])
print(arr)

【讨论】:

  • 值得注意的是,.translate()dict 参数 在 Python 2 中被支持,但仅作为 unicode 字符串的方法。所以stg=u"...." 会这样做,或者stg = stg.decode('utf-8')
猜你喜欢
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
相关资源
最近更新 更多