Reputation: 1693
In test.txt:
rt : objective
tr350rt : objective
rtrt : objective
@username : objective
@user_1236 : objective
@254test!! : objective
@test : objective
#15 : objective
My codes:
import re
file3 = 'C://Users/Desktop/test.txt'
rfile3 = open(file3).read()
for altext in rfile3.split("\n"):
saltext = altext.split("\t")
for saltword in saltext:
ssaltword = saltword.split(" ")
if re.search(r'^rt$', ssaltword[0]):
print ssaltword[0], ssaltword[2]
testreplace = open(file3, 'w').write(rfile3.replace(ssaltword[0], ""))
if re.search(r'^@\w', ssaltword[0]):
print ssaltword[0], ssaltword[2]
testreplace = open(file3, 'w').write(rfile3.replace(ssaltword[0], ""))
I got:
: objective
tr350 : objective
: objective
@username : objective
@user_1236 : objective
@254test!! : objective
: objective
#15 : objective
I am trying to replace only "rt" and all @ with space
But from my codes all "rt" were replaced and only one @ was replaced.
I would like to get:
: objective
tr350rt : objective
rtrt : objective
: objective
: objective
: objective
: objective
#15 : objective
Any suggestion?
Upvotes: 2
Views: 158
Reputation: 21506
Try this,
import os
mydict = {"@":'',"rt":''}
filepath = 'C://Users/Desktop/test.txt'
s = open(filepath).read()
for k, v in mydict.iteritems():
s = s.replace(k, v)
f = open(filepath, 'w')
f.write(s)
f.close()
Upvotes: 1
Reputation:
Not even necessary to use regex here:
with open("test.txt") as file:
lines = file.readlines()
for line in lines:
if (line.startswith("@") and ":" in line) or line.startswith("rt :"):
line = " :" + line.split(":", 1)[1]
Upvotes: 1
Reputation: 353569
I think regex is overkill here:
with open("test.txt") as in_fp, open("test2.txt", "w") as out_fp:
for line in in_fp:
ls = line.split()
if ls and (ls[0].startswith("@") or ls[0] == "rt"):
line = line.replace(ls[0], "", 1)
out_fp.write(line)
produces
localhost-2:coding $ cat test2.txt
: objective
tr350rt : objective
rtrt : objective
: objective
: objective
: objective
: objective
#15 : objective
Note that I've also changed it not to overwrite the original.
Edit: if you really want to overwrite the original in-place, then I'd read the whole thing into memory first:
with open("test.txt") as fp:
lines = fp.readlines()
with open("test.txt", "w") as out_fp:
for line in lines:
ls = line.split()
if ls and (ls[0].startswith("@") or ls[0] == "rt"):
line = line.replace(ls[0], "", 1)
out_fp.write(line)
Upvotes: 2
Reputation: 336478
import re
with open("test.txt") as infile:
text = infile.read()
newtext = re.sub(r"(?m)^(?:rt\b|@\w+)(?=\s*:)", " ", text)
Explanation:
(?m) # Turn on multiline mode
^ # Match start of line
(?: # Either match...
rt\b # rt (as a complete word
| # or
@\w+ # @ followed by an alphanumeric "word"
) # End of alternation
(?=\s*:) # Assert that a colon follows (after optional whitespace)
Upvotes: 1