Как манипулировать следующим текстом - PullRequest
0 голосов
/ 15 марта 2011

Мне было интересно, как преобразовать текст, подобный следующему:

Chapter 3 Convex Functions 97
3.1 Definitions 98
3.2 Basic Properties 103

в:

("Chapter 3 Convex Functions 97" "#97")
("3.1 Definitions 98" "#98")
("3.2 Basic Properties 103" "#103")

, используя некоторые удобные, но мощные языки для работы с текстом и / или такие утилиты, какsed, awk, regex, perl, python, ...

Спасибо и всего наилучшего!


Примечание: в каждой строке повторяется последнее число.

Ответы [ 7 ]

5 голосов
/ 15 марта 2011

Вот решение Perl:

while (<DATA>) {
    s/^(.+ (\d+))$/("$1" "#$2")/;
    print;
}

__DATA__
Chapter 3 Convex Functions 97
3.1 Definitions 98
3.2 Basic Properties 103

печать:

("Chapter 3 Convex Functions 97" "#97")
("3.1 Definitions 98" "#98")
("3.2 Basic Properties 103" "#103")

или как один вкладыш:

perl -pe 's/^(.+ (\d+))$/("$1" "#$2")/'
2 голосов
/ 15 марта 2011

Вот несколько способов сделать это, используя sed:

sed 's/\(.* \)\(.*\)/("\1\2" "#\2")/' inputfile

или

sed 's/\(.* \)\([0-9]*\)/("\1\2" "#\2")/' inputfile

Вот пара, использующая AWK:

awk '{n = $NF; print "(\"" $0 "\" \"#" n "\")"}' inputfile

или

awk 'BEGIN {q="\x22"} {n = $NF; print "(" q $0 q " " q "#" n q ")"}' inputfile
2 голосов
/ 15 марта 2011

Работает практически со всеми версиями python

infile = open("input.txt")
outfile = open("output.txt", "w")

for line in infile:
    line, last = line.rstrip().rsplit(" ", 1)
    outfile.write('("%s %s" "#%s")\n' % (line, last, last))
2 голосов
/ 15 марта 2011

В Python

"Chapter 3 Convex Functions 97".rsplit(None,1)

дает

['Chapter 3 Convex Functions', '97']

Работая с блоком текста,

txt = """Chapter 3 Convex Functions 97
    3.1 Definitions 98
    3.2 Basic Properties 103"""

for line in txt.split('\n'):
    line = line.strip().rsplit(None,1)
    print('("{0} {1}" "#{1}")'.format(*line))

дает

("Chapter 3 Convex Functions 97" "#97")
("3.1 Definitions 98" "#98")
("3.2 Basic Properties 103" "#103")

Редактировать: Я обновил его для вашей заметки, так что номера страниц дублируются.

1 голос
/ 15 марта 2011
import re
pat = re.compile('^(.+?(\d+)) *$',re.M)

ch = '''Chapter 3 Convex Functions 97 
3.1 Definitions 98  
3.2 Basic Properties 103'''

print ch
print
print pat.sub('"\\1" "#\\2"',ch)

результат

Chapter 3 Convex Functions 97 
3.1 Definitions 98  
3.2 Basic Properties 103

"Chapter 3 Convex Functions 97" "#97"
"3.1 Definitions 98" "#98"
"3.2 Basic Properties 103" "#103"
1 голос
/ 15 марта 2011
def munge(line):
    number = line.rsplit(None,1)[1]
    return '''("{0}" "#{1}")'''.format(line, number)
1 голос
/ 15 марта 2011
import re
def format(str):
  m = re.search('(.*)\s(\d+)$', str)
  return "(\"" + m.group(1) + "\" \"#" +  m.group(2) + "\")"

print format('Chapter 3 Convex Functions 97')

print format('3.1 Definitions 98')

print format('3.2 Basic Properties 103')

возвращает

("Chapter 3 Convex Functions" "#97")
("3.1 Definitions" "#98")
("3.2 Basic Properties" "#103")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...